[PATCH conductor 1/3] BZ 717987 (1) - Added realms available flag

Scott Seago sseago at redhat.com
Mon Feb 6 14:01:54 UTC 2012


On 02/03/2012 10:10 AM, jprovazn at redhat.com wrote:
> From: Jan Provaznik<jprovazn at redhat.com>
>
> TODO: status of current availability is not displayed anywhere in UI yet
> ---
>   src/app/models/provider.rb                         |   23 +++++++++++++++++--
>   src/app/models/provider_account.rb                 |    7 ++++-
>   .../20120202121555_add_realm_available_column.rb   |   11 +++++++++
>   src/spec/factories/provider.rb                     |    7 ++++++
>   src/spec/factories/realm.rb                        |    1 -
>   src/spec/models/instance_spec.rb                   |   19 ++++++++++++++++
>   6 files changed, 62 insertions(+), 6 deletions(-)
>   create mode 100644 src/db/migrate/20120202121555_add_realm_available_column.rb
>
> diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb
> index 01c0d3e..498304d 100644
> --- a/src/app/models/provider.rb
> +++ b/src/app/models/provider.rb
> @@ -134,6 +134,15 @@ class Provider<  ActiveRecord::Base
>
>     def populate_realms
>       reload
> +
> +    # if the provider is not running, mark as unavailable and don't refresh its
> +    # realms
> +    unless valid_framework?
> +      update_attribute(:available, false)
> +      logger.warn "provider #{name} is not available"
> +      return
> +    end
> +
>       conductor_acct_realms = {}
>       conductor_acct_realm_ids = {}
>       deltacloud_realms = []
> @@ -141,7 +150,12 @@ class Provider<  ActiveRecord::Base
>       dc_acct_realm_ids = {}
>       self.transaction do
>         provider_accounts.each do |acct|
> -        client = acct.connect
> +        # if account is not accessible (but provider is running)
> +        # account's realms will be removed
> +        unless client = acct.connect
> +          logger.warn "provider account #{acct.name} is not available"
> +          next
> +        end
>           dc_acct_realms[acct.label] = client.realms
>           dc_acct_realm_ids[acct.label] = dc_acct_realms[acct.label].collect{|r| r.id}
>           dc_acct_realms[acct.label].each do |dc_realm|
> @@ -172,16 +186,19 @@ class Provider<  ActiveRecord::Base
>
>         # Add anything in Deltacloud to Conductor if it's not already there
>         deltacloud_realms.each do |d_realm|
> -        unless conductor_realm_ids.include?(d_realm.id)
> +        if ar_realm = conductor_realms.detect {|r| r.external_key == d_realm.id}
> +          ar_realm.available = d_realm.state == 'AVAILABLE'
> +        else
>             ar_realm = Realm.new(:external_key =>  d_realm.id,
>                                    :name =>  d_realm.name ? d_realm.name : d_realm.id,
>                                    :provider_id =>  id)
You need to set ar_realm.available in the new realm too, otherwise a new 
unavailable realm will initially show up as available.

> -          ar_realm.save!
>           end
> +        ar_realm.save!
>         end
>
>         # add any new provider account realm mappings
>         provider_accounts.each do |acct|
> +        next unless dc_acct_realms[acct.label]
>           dc_acct_realms[acct.label].each do |d_realm|
>             unless conductor_acct_realm_ids[acct.label].include?(d_realm.id)
>               acct.realms<<  realms.where("external_key" =>  d_realm.id)
> diff --git a/src/app/models/provider_account.rb b/src/app/models/provider_account.rb
> index 89009aa..82b44c4 100644
> --- a/src/app/models/provider_account.rb
> +++ b/src/app/models/provider_account.rb
> @@ -352,13 +352,16 @@ class ProviderAccount<  ActiveRecord::Base
>       else
>         account_images.each do |pi|
>           if not instance.frontend_realm.nil?
> -          brealms = instance.frontend_realm.realm_backend_targets.select {|brealm_target| brealm_target.target_provider == provider}
> +          brealms = instance.frontend_realm.realm_backend_targets.select {|brealm_target| brealm_target.target_provider == provider and brealm_target.target_provider.available}
Instead of checking provider availablity here, we should check at the 
beginning of the match method:
     if !provider.enabled?
       errors << I18n.t('instances.errors.must_be_enabled', 
:account_name => name)
perhaps with a new 'if' clause checking availability and returning 
instances.errors.provider_unavailable. Otherwise when realm is blank we 
won't be verifying provider availability.
>             if brealms.empty?
>               errors<<  I18n.t('instances.errors.realm_not_mapped', :frontend_realm_name =>  instance.frontend_realm.name)
>               next
>             end
>             brealms.each do |brealm_target|
> -            if (brealm_target.target_realm.nil? || realms.include?(brealm_target.target_realm))
> +            # add match if realm is mapped to provider or if it's mapped to
> +            # backend realm which is available and is accessible for this
> +            # provider account
> +            if (brealm_target.target_realm.nil? || (brealm_target.target_realm.available&&  realms.include?(brealm_target.target_realm)))
>                 matched<<  Instance::Match.new(instance.pool.pool_family, self, hwp, pi, brealm_target.target_realm)
>               end
>             end
...

Scott




More information about the aeolus-devel mailing list