lib/sfn/provider.rb in sfn-2.1.6 vs lib/sfn/provider.rb in sfn-2.1.8

- old
+ new

@@ -86,24 +86,30 @@ async ? update_stack_list! : fetch_stacks end end # @return [Miasma::Orchestration::Stacks] - def stacks - connection.stacks.from_json(cached_stacks) + def stacks(stack_id=nil) + connection.stacks.from_json(cached_stacks(stack_id)) end # @return [String] json representation of cached stacks - def cached_stacks - fetch_stacks unless @initial_fetch_complete + def cached_stacks(stack_id=nil) + unless(@initial_fetch_complete || stack_id) + recache = true + if(stack_id && @initial_fetch_complete) + recache = !!stacks.get(stack_id) + end + fetch_stacks(stack_id) if recache + end value = cache[:stacks].value value ? MultiJson.dump(MultiJson.load(value).values) : '[]' end # @return [Miasma::Orchestration::Stack, NilClass] def stack(stack_id) - stacks.get(stack_id) + stacks(stack_id).get(stack_id) end # Store stack attribute changes # # @param stack_id [String] @@ -160,26 +166,35 @@ end # Request stack information and store in cache # # @return [TrueClass] - def fetch_stacks + def fetch_stacks(stack_id=nil) cache.locked_action(:stacks_lock) do logger.info "Lock aquired for stack update. Requesting stacks from upstream. (#{Thread.current})" - stacks = Hash[ - connection.stacks.reload.all.map do |stack| - [stack.id, stack.attributes] - end - ] + if(stack_id) + single_stack = connection.stacks.get(stack_id) + stacks = single_stack ? {single_stack.id => single_stack} : {} + else + stacks = Hash[ + connection.stacks.reload.all.map do |stack| + [stack.id, stack.attributes] + end + ] + end if(cache[:stacks].value) existing_stacks = MultiJson.load(cache[:stacks].value) # Force common types stacks = MultiJson.load(MultiJson.dump(stacks)) - # Remove stacks that have been deleted - stale_ids = existing_stacks.keys - stacks.keys - stacks = existing_stacks.to_smash.deep_merge(stacks) - stale_ids.each do |stale_id| - stacks.delete(stale_id) + if(stack_id) + stacks = existing_stacks.to_smash.deep_merge(stacks) + else + # Remove stacks that have been deleted + stale_ids = existing_stacks.keys - stacks.keys + stacks = existing_stacks.to_smash.deep_merge(stacks) + stale_ids.each do |stale_id| + stacks.delete(stale_id) + end end end cache[:stacks].value = stacks.to_json logger.info 'Stack list has been updated from upstream and cached locally' end