diff options
| author | elijah <elijah@riseup.net> | 2015-09-09 18:05:19 -0700 | 
|---|---|---|
| committer | elijah <elijah@riseup.net> | 2015-09-09 18:05:19 -0700 | 
| commit | f93e6904fe2abca3cfc7a93a08892dbdcea97327 (patch) | |
| tree | fadf3f5670b168942792d78a93b43aaeaf6daf7c /lib/leap_cli/macros | |
| parent | 492c452801e2679d47b3b09505779a11ed3892cc (diff) | |
ensure that the webapp has the service levels config it requires.
Diffstat (limited to 'lib/leap_cli/macros')
| -rw-r--r-- | lib/leap_cli/macros/provider.rb | 70 | 
1 files changed, 70 insertions, 0 deletions
diff --git a/lib/leap_cli/macros/provider.rb b/lib/leap_cli/macros/provider.rb index 84c4e1b8..4e74da01 100644 --- a/lib/leap_cli/macros/provider.rb +++ b/lib/leap_cli/macros/provider.rb @@ -16,5 +16,75 @@ module LeapCli        }      end +    # +    # The webapp will not work unless the service level configuration is precisely defined. +    # Here, we take what the sysadmin has specified in provider.json and clean it up to +    # ensure it is OK. +    # +    # It would be better to add support for JSON schema. +    # +    def service_levels() +      levels = {} +      provider.service.levels.each do |name, level| +        if name =~ /^[0-9]+$/ +          name = name.to_i +        end +        levels[name] = level_cleanup(name, level.clone) +      end +      levels +    end + +    private + +    def print_warning(name, msg) +      if self.environment +        provider_str = "provider.json or %s" % ['provider', self.environment, 'json'].join('.') +      else +        provider_str = "provider.json" +      end +      LeapCli::log :warning, "In #{provider_str}, you have an incorrect definition for service level '#{name}':" do +        LeapCli::log msg +      end +    end + +    def level_cleanup(name, level) +      unless level['name'] +        print_warning(name, 'required field "name" is missing') +      end +      unless level['description'] +        print_warning(name, 'required field "description" is missing') +      end +      unless level['bandwidth'].nil? || level['bandwidth'] == 'limited' +        print_warning(name, 'field "bandwidth" must be nil or "limited"') +      end +      unless level['rate'].nil? || level['rate'].is_a?(Hash) +        print_warning(name, 'field "rate" must be nil or a hash (e.g. {"USD":10, "EUR":10})') +      end +      possible_services = enabled_services +      if level['services'] +        level['services'].each do |service| +          unless possible_services.include? service +            print_warning(name, "the service '#{service}' does not exist or there are no nodes that provide this service.") +            LeapCli::Util::bail! +          end +        end +      else +        level['services'] = possible_services +      end +      level['services'] = remap_services(level['services']) +      level +    end + +    # +    # the service names that the webapp uses and that leap_platform uses are different. ugh. +    # +    SERVICE_MAP = { +      "mx" => "email", +      "openvpn" => "eip" +    } +    def remap_services(services) +      services.map {|srv| SERVICE_MAP[srv]} +    end +    end  end  | 
