kubernetes-deploy 0.18.0 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/ISSUE_TEMPLATE.md +25 -0
- data/README.md +2 -3
- data/lib/kubernetes-deploy.rb +1 -0
- data/lib/kubernetes-deploy/deploy_task.rb +8 -5
- data/lib/kubernetes-deploy/kubernetes_resource.rb +34 -32
- data/lib/kubernetes-deploy/kubernetes_resource/bucket.rb +2 -7
- data/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb +20 -49
- data/lib/kubernetes-deploy/kubernetes_resource/config_map.rb +4 -10
- data/lib/kubernetes-deploy/kubernetes_resource/cron_job.rb +0 -10
- data/lib/kubernetes-deploy/kubernetes_resource/daemon_set.rb +36 -32
- data/lib/kubernetes-deploy/kubernetes_resource/deployment.rb +69 -66
- data/lib/kubernetes-deploy/kubernetes_resource/elasticsearch.rb +1 -16
- data/lib/kubernetes-deploy/kubernetes_resource/ingress.rb +2 -8
- data/lib/kubernetes-deploy/kubernetes_resource/memcached.rb +18 -31
- data/lib/kubernetes-deploy/kubernetes_resource/persistent_volume_claim.rb +4 -10
- data/lib/kubernetes-deploy/kubernetes_resource/pod.rb +28 -31
- data/lib/kubernetes-deploy/kubernetes_resource/pod_disruption_budget.rb +2 -8
- data/lib/kubernetes-deploy/kubernetes_resource/pod_set_base.rb +10 -12
- data/lib/kubernetes-deploy/kubernetes_resource/pod_template.rb +2 -8
- data/lib/kubernetes-deploy/kubernetes_resource/redis.rb +19 -48
- data/lib/kubernetes-deploy/kubernetes_resource/replica_set.rb +33 -35
- data/lib/kubernetes-deploy/kubernetes_resource/resource_quota.rb +3 -14
- data/lib/kubernetes-deploy/kubernetes_resource/service.rb +20 -34
- data/lib/kubernetes-deploy/kubernetes_resource/service_account.rb +2 -8
- data/lib/kubernetes-deploy/kubernetes_resource/stateful_set.rb +37 -31
- data/lib/kubernetes-deploy/kubernetes_resource/statefulservice.rb +1 -16
- data/lib/kubernetes-deploy/kubernetes_resource/topic.rb +1 -16
- data/lib/kubernetes-deploy/resource_watcher.rb +6 -3
- data/lib/kubernetes-deploy/restart_task.rb +3 -1
- data/lib/kubernetes-deploy/sync_mediator.rb +66 -0
- data/lib/kubernetes-deploy/version.rb +1 -1
- metadata +4 -3
- data/lib/kubernetes-deploy/kubernetes_resource/bugsnag.rb +0 -33
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 820602ac9a434949fb86a0f1cb85996962d4ecb2
         | 
| 4 | 
            +
              data.tar.gz: 492b43ccf6a0683b93cc3b187c6711e9bdb176b1
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 23706dd66b3844c4b6fece858621bf4b9cea5c0c65568b972cb6afdfab64a1f8d45957c7095a3ca8af96f9c488f383f2f1fd69d99d5affdbf9545d9c0c7ac948
         | 
| 7 | 
            +
              data.tar.gz: 64bf0d15a51c97be05e80a3b64b0e3f985f0f6a0bd137fbd1e6353b13bec404e6dd150a66f34c15f0f24cfee66a1838efba2d6260bf6ece9bf5c4c0903e55e12
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,4 +1,8 @@ | |
| 1 | 
            -
            ### 0. | 
| 1 | 
            +
            ### 0.18.1
         | 
| 2 | 
            +
            *Enhancements*
         | 
| 3 | 
            +
            - Change the way the resource watcher fetches resources to make it more efficient for large deploys. Deploys with hundreds of resources are expected to see a measurable performance improvement from this change. ([#251](https://github.com/Shopify/kubernetes-deploy/pull/251))
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ### 0.18.0
         | 
| 2 6 | 
             
            *Features*
         | 
| 3 7 | 
             
            - kubernetes-restart and kubernetes-deploy use exit code 70 when a
         | 
| 4 8 | 
             
            deploy fails due to one or more resources failing to deploy in time.
         | 
    
        data/ISSUE_TEMPLATE.md
    ADDED
    
    | @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            <!-- Please erase any parts of this template not applicable to your issue. -->
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # Bug report
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            [Description of the bug]
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            **Expected behavior:** [What you expected to happen]
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            **Actual behavior:** [What actually happened]
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            **Version(s) affected:** [run `kubernetes-deploy --version`]
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            ### Steps to Reproduce
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            1. [First Step]
         | 
| 16 | 
            +
            2. [Second Step]
         | 
| 17 | 
            +
            3. [and so on...]
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            # Feature request
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            - [ ] If the maintainers agree with the feature as described here, I intend to submit a Pull Request myself.<sup>1</sup>
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            **Proposal:** [provide details on the behaviour you'd like to see and why it would be useful]
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            <sup><small>1</small></sup> <sub>This is the quickest way to get a new feature! We reserve the right to close feature requests, even ones we like, if the proposer does not intend to contribute to the feature and it doesn't fit in our current roadmap.</sub>
         | 
    
        data/README.md
    CHANGED
    
    | @@ -121,7 +121,7 @@ All templates must be YAML formatted. You can also use ERB. The following local | |
| 121 121 | 
             
            * `current_sha`: The value of `$REVISION`
         | 
| 122 122 | 
             
            * `deployment_id`:  A randomly generated identifier for the deploy. Useful for creating unique names for task-runner pods (e.g. a pod that runs rails migrations at the beginning of deploys).
         | 
| 123 123 |  | 
| 124 | 
            -
            You can add additional variables using the `--bindings=BINDINGS` option. For example, `kubernetes-deploy my-app cluster1 --bindings=color=blue,size=large` will expose `color` and `size` in your templates.
         | 
| 124 | 
            +
            You can add additional variables using the `--bindings=BINDINGS` option which can be formated as comma separated or as JSON. For example, `kubernetes-deploy my-app cluster1 --bindings=color=blue,size=large` or `kubernetes-deploy my-app cluster1 --bindings='{"color":"blue","size":"large"}'` will expose `color` and `size` in your templates. Complex JSON data will be converted to a Hash for use in templates.
         | 
| 125 125 |  | 
| 126 126 | 
             
            #### Using partials
         | 
| 127 127 |  | 
| @@ -427,10 +427,9 @@ This gem uses subclasses of `KubernetesResource` to implement custom success/fai | |
| 427 427 |  | 
| 428 428 | 
             
            1. Create a the file for your type in `lib/kubernetes-deploy/kubernetes_resource/`
         | 
| 429 429 | 
             
            2. Create a new class that inherits from `KubernetesResource`. Minimally, it should implement the following methods:
         | 
| 430 | 
            -
                * `sync` --  | 
| 430 | 
            +
                * `sync` -- Gather the data you'll need to determine `deploy_succeeded?` and `deploy_failed?`. The superclass's implementation fetches the corresponding resource, parses it and stores it in `@instance_data`. You can define your own implementation if you need something else.
         | 
| 431 431 | 
             
                * `deploy_succeeded?`
         | 
| 432 432 | 
             
                * `deploy_failed?`
         | 
| 433 | 
            -
                * `exists?`
         | 
| 434 433 | 
             
            3. Adjust the `TIMEOUT` constant to an appropriate value for this type.
         | 
| 435 434 | 
             
            4. Add the a basic example of the type to the hello-cloud [fixture set](https://github.com/Shopify/kubernetes-deploy/tree/master/test/fixtures/hello-cloud) and appropriate assertions to `#assert_all_up` in [`hello_cloud.rb`](https://github.com/Shopify/kubernetes-deploy/blob/master/test/helpers/fixture_sets/hello_cloud.rb). This will get you coverage in several existing tests, such as `test_full_hello_cloud_set_deploy_succeeds`.
         | 
| 436 435 | 
             
            5. Add tests for any edge cases you foresee.
         | 
    
        data/lib/kubernetes-deploy.rb
    CHANGED
    
    | @@ -19,6 +19,7 @@ require 'kubernetes-deploy/statsd' | |
| 19 19 | 
             
            require 'kubernetes-deploy/concurrency'
         | 
| 20 20 | 
             
            require 'kubernetes-deploy/bindings_parser'
         | 
| 21 21 | 
             
            require 'kubernetes-deploy/duration_parser'
         | 
| 22 | 
            +
            require 'kubernetes-deploy/sync_mediator'
         | 
| 22 23 |  | 
| 23 24 | 
             
            module KubernetesDeploy
         | 
| 24 25 | 
             
              MIN_KUBE_VERSION = '1.7.0'
         | 
| @@ -16,7 +16,6 @@ require 'kubernetes-deploy/kubernetes_resource' | |
| 16 16 | 
             
              memcached
         | 
| 17 17 | 
             
              service
         | 
| 18 18 | 
             
              pod_template
         | 
| 19 | 
            -
              bugsnag
         | 
| 20 19 | 
             
              pod_disruption_budget
         | 
| 21 20 | 
             
              replica_set
         | 
| 22 21 | 
             
              service_account
         | 
| @@ -46,7 +45,6 @@ module KubernetesDeploy | |
| 46 45 | 
             
                  Cloudsql
         | 
| 47 46 | 
             
                  Redis
         | 
| 48 47 | 
             
                  Memcached
         | 
| 49 | 
            -
                  Bugsnag
         | 
| 50 48 | 
             
                  ConfigMap
         | 
| 51 49 | 
             
                  PersistentVolumeClaim
         | 
| 52 50 | 
             
                  ServiceAccount
         | 
| @@ -103,6 +101,7 @@ module KubernetesDeploy | |
| 103 101 | 
             
                    logger: @logger,
         | 
| 104 102 | 
             
                    bindings: bindings,
         | 
| 105 103 | 
             
                  )
         | 
| 104 | 
            +
                  @sync_mediator = SyncMediator.new(namespace: @namespace, context: @context, logger: @logger)
         | 
| 106 105 | 
             
                end
         | 
| 107 106 |  | 
| 108 107 | 
             
                def run(*args)
         | 
| @@ -124,7 +123,7 @@ module KubernetesDeploy | |
| 124 123 | 
             
                  validate_definitions(resources)
         | 
| 125 124 |  | 
| 126 125 | 
             
                  @logger.phase_heading("Checking initial resource statuses")
         | 
| 127 | 
            -
                   | 
| 126 | 
            +
                  @sync_mediator.sync(resources)
         | 
| 128 127 | 
             
                  resources.each { |r| @logger.info(r.pretty_status) }
         | 
| 129 128 |  | 
| 130 129 | 
             
                  ejson = EjsonSecretProvisioner.new(
         | 
| @@ -207,6 +206,9 @@ module KubernetesDeploy | |
| 207 206 | 
             
                    failed_resources = matching_resources.reject(&:deploy_succeeded?)
         | 
| 208 207 | 
             
                    fail_count = failed_resources.length
         | 
| 209 208 | 
             
                    if fail_count > 0
         | 
| 209 | 
            +
                      KubernetesDeploy::Concurrency.split_across_threads(failed_resources) do |r|
         | 
| 210 | 
            +
                        r.sync_debug_info(@sync_mediator.kubectl)
         | 
| 211 | 
            +
                      end
         | 
| 210 212 | 
             
                      failed_resources.each { |r| @logger.summary.add_paragraph(r.debug_message) }
         | 
| 211 213 | 
             
                      raise FatalDeploymentError, "Failed to deploy #{fail_count} priority #{'resource'.pluralize(fail_count)}"
         | 
| 212 214 | 
             
                    end
         | 
| @@ -215,7 +217,7 @@ module KubernetesDeploy | |
| 215 217 | 
             
                end
         | 
| 216 218 |  | 
| 217 219 | 
             
                def validate_definitions(resources)
         | 
| 218 | 
            -
                  KubernetesDeploy::Concurrency.split_across_threads(resources | 
| 220 | 
            +
                  KubernetesDeploy::Concurrency.split_across_threads(resources) { |r| r.validate_definition(kubectl) }
         | 
| 219 221 | 
             
                  failed_resources = resources.select(&:validation_failed?)
         | 
| 220 222 | 
             
                  return unless failed_resources.present?
         | 
| 221 223 |  | 
| @@ -373,7 +375,8 @@ module KubernetesDeploy | |
| 373 375 | 
             
                  apply_all(applyables, prune)
         | 
| 374 376 |  | 
| 375 377 | 
             
                  if verify
         | 
| 376 | 
            -
                    watcher = ResourceWatcher.new(resources,  | 
| 378 | 
            +
                    watcher = ResourceWatcher.new(resources: resources, sync_mediator: @sync_mediator,
         | 
| 379 | 
            +
                      logger: @logger, deploy_started_at: deploy_started_at)
         | 
| 377 380 | 
             
                    watcher.run(record_summary: record_summary)
         | 
| 378 381 | 
             
                  end
         | 
| 379 382 | 
             
                end
         | 
| @@ -2,7 +2,6 @@ | |
| 2 2 | 
             
            require 'json'
         | 
| 3 3 | 
             
            require 'open3'
         | 
| 4 4 | 
             
            require 'shellwords'
         | 
| 5 | 
            -
            require 'kubernetes-deploy/kubectl'
         | 
| 6 5 |  | 
| 7 6 | 
             
            module KubernetesDeploy
         | 
| 8 7 | 
             
              class KubernetesResource
         | 
| @@ -28,20 +27,26 @@ module KubernetesDeploy | |
| 28 27 |  | 
| 29 28 | 
             
                TIMEOUT_OVERRIDE_ANNOTATION = "kubernetes-deploy.shopify.io/timeout-override"
         | 
| 30 29 |  | 
| 31 | 
            -
                 | 
| 32 | 
            -
                   | 
| 33 | 
            -
             | 
| 34 | 
            -
                     | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
                     | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 30 | 
            +
                class << self
         | 
| 31 | 
            +
                  def build(namespace:, context:, definition:, logger:)
         | 
| 32 | 
            +
                    opts = { namespace: namespace, context: context, definition: definition, logger: logger }
         | 
| 33 | 
            +
                    if KubernetesDeploy.const_defined?(definition["kind"])
         | 
| 34 | 
            +
                      klass = KubernetesDeploy.const_get(definition["kind"])
         | 
| 35 | 
            +
                      klass.new(**opts)
         | 
| 36 | 
            +
                    else
         | 
| 37 | 
            +
                      inst = new(**opts)
         | 
| 38 | 
            +
                      inst.type = definition["kind"]
         | 
| 39 | 
            +
                      inst
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  def timeout
         | 
| 44 | 
            +
                    self::TIMEOUT
         | 
| 40 45 | 
             
                  end
         | 
| 41 | 
            -
                end
         | 
| 42 46 |  | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 47 | 
            +
                  def kind
         | 
| 48 | 
            +
                    name.demodulize
         | 
| 49 | 
            +
                  end
         | 
| 45 50 | 
             
                end
         | 
| 46 51 |  | 
| 47 52 | 
             
                def timeout
         | 
| @@ -74,9 +79,10 @@ module KubernetesDeploy | |
| 74 79 | 
             
                  @definition = definition
         | 
| 75 80 | 
             
                  @statsd_report_done = false
         | 
| 76 81 | 
             
                  @validation_errors = []
         | 
| 82 | 
            +
                  @instance_data = {}
         | 
| 77 83 | 
             
                end
         | 
| 78 84 |  | 
| 79 | 
            -
                def validate_definition
         | 
| 85 | 
            +
                def validate_definition(kubectl)
         | 
| 80 86 | 
             
                  @validation_errors = []
         | 
| 81 87 | 
             
                  validate_timeout_annotation
         | 
| 82 88 |  | 
| @@ -103,7 +109,8 @@ module KubernetesDeploy | |
| 103 109 | 
             
                  file.path
         | 
| 104 110 | 
             
                end
         | 
| 105 111 |  | 
| 106 | 
            -
                def sync
         | 
| 112 | 
            +
                def sync(mediator)
         | 
| 113 | 
            +
                  @instance_data = mediator.get_instance(type, name)
         | 
| 107 114 | 
             
                end
         | 
| 108 115 |  | 
| 109 116 | 
             
                def deploy_failed?
         | 
| @@ -115,7 +122,8 @@ module KubernetesDeploy | |
| 115 122 | 
             
                end
         | 
| 116 123 |  | 
| 117 124 | 
             
                def deploy_succeeded?
         | 
| 118 | 
            -
                   | 
| 125 | 
            +
                  return false unless deploy_started?
         | 
| 126 | 
            +
                  unless @success_assumption_warning_shown
         | 
| 119 127 | 
             
                    @logger.warn("Don't know how to monitor resources of type #{type}. Assuming #{id} deployed successfully.")
         | 
| 120 128 | 
             
                    @success_assumption_warning_shown = true
         | 
| 121 129 | 
             
                  end
         | 
| @@ -123,15 +131,15 @@ module KubernetesDeploy | |
| 123 131 | 
             
                end
         | 
| 124 132 |  | 
| 125 133 | 
             
                def exists?
         | 
| 126 | 
            -
                   | 
| 134 | 
            +
                  @instance_data.present?
         | 
| 127 135 | 
             
                end
         | 
| 128 136 |  | 
| 129 137 | 
             
                def status
         | 
| 130 | 
            -
                   | 
| 138 | 
            +
                  exists? ? "Exists" : "Unknown"
         | 
| 131 139 | 
             
                end
         | 
| 132 140 |  | 
| 133 141 | 
             
                def type
         | 
| 134 | 
            -
                  @type || self.class. | 
| 142 | 
            +
                  @type || self.class.kind
         | 
| 135 143 | 
             
                end
         | 
| 136 144 |  | 
| 137 145 | 
             
                def deploy_timed_out?
         | 
| @@ -144,15 +152,13 @@ module KubernetesDeploy | |
| 144 152 | 
             
                  :apply
         | 
| 145 153 | 
             
                end
         | 
| 146 154 |  | 
| 147 | 
            -
                def sync_debug_info
         | 
| 148 | 
            -
                  @events = fetch_events unless ENV[DISABLE_FETCHING_EVENT_INFO]
         | 
| 149 | 
            -
                  @logs = fetch_logs if supports_logs? && !ENV[DISABLE_FETCHING_EVENT_INFO]
         | 
| 155 | 
            +
                def sync_debug_info(kubectl)
         | 
| 156 | 
            +
                  @events = fetch_events(kubectl) unless ENV[DISABLE_FETCHING_EVENT_INFO]
         | 
| 157 | 
            +
                  @logs = fetch_logs(kubectl) if supports_logs? && !ENV[DISABLE_FETCHING_EVENT_INFO]
         | 
| 150 158 | 
             
                  @debug_info_synced = true
         | 
| 151 159 | 
             
                end
         | 
| 152 160 |  | 
| 153 161 | 
             
                def debug_message
         | 
| 154 | 
            -
                  sync_debug_info unless @debug_info_synced
         | 
| 155 | 
            -
             | 
| 156 162 | 
             
                  helpful_info = []
         | 
| 157 163 | 
             
                  if deploy_failed?
         | 
| 158 164 | 
             
                    helpful_info << ColorizedString.new("#{id}: FAILED").red
         | 
| @@ -210,9 +216,10 @@ module KubernetesDeploy | |
| 210 216 | 
             
                #     "Pulled: Successfully pulled image "hello-world:latest" (1 events)"
         | 
| 211 217 | 
             
                #   ]
         | 
| 212 218 | 
             
                # }
         | 
| 213 | 
            -
                def fetch_events
         | 
| 219 | 
            +
                def fetch_events(kubectl)
         | 
| 214 220 | 
             
                  return {} unless exists?
         | 
| 215 | 
            -
                  out, _err, st = kubectl.run("get", "events", "--output=go-template=#{Event.go_template_for(type, name)}" | 
| 221 | 
            +
                  out, _err, st = kubectl.run("get", "events", "--output=go-template=#{Event.go_template_for(type, name)}",
         | 
| 222 | 
            +
                    log_failure: false)
         | 
| 216 223 | 
             
                  return {} unless st.success?
         | 
| 217 224 |  | 
| 218 225 | 
             
                  event_collector = Hash.new { |hash, key| hash[key] = [] }
         | 
| @@ -230,12 +237,7 @@ module KubernetesDeploy | |
| 230 237 |  | 
| 231 238 | 
             
                def pretty_status
         | 
| 232 239 | 
             
                  padding = " " * [50 - id.length, 1].max
         | 
| 233 | 
            -
                   | 
| 234 | 
            -
                  "#{id}#{padding}#{msg}"
         | 
| 235 | 
            -
                end
         | 
| 236 | 
            -
             | 
| 237 | 
            -
                def kubectl
         | 
| 238 | 
            -
                  @kubectl ||= Kubectl.new(namespace: @namespace, context: @context, logger: @logger, log_failure_by_default: false)
         | 
| 240 | 
            +
                  "#{id}#{padding}#{status}"
         | 
| 239 241 | 
             
                end
         | 
| 240 242 |  | 
| 241 243 | 
             
                def report_status_to_statsd(watch_time)
         | 
| @@ -1,11 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 | 
             
            module KubernetesDeploy
         | 
| 3 3 | 
             
              class Bucket < KubernetesResource
         | 
| 4 | 
            -
                def sync
         | 
| 5 | 
            -
                  _, _err, st = kubectl.run("get", type, @name)
         | 
| 6 | 
            -
                  @found = st.success?
         | 
| 7 | 
            -
                end
         | 
| 8 | 
            -
             | 
| 9 4 | 
             
                def deploy_succeeded?
         | 
| 10 5 | 
             
                  return false unless deploy_started?
         | 
| 11 6 |  | 
| @@ -16,8 +11,8 @@ module KubernetesDeploy | |
| 16 11 | 
             
                  true
         | 
| 17 12 | 
             
                end
         | 
| 18 13 |  | 
| 19 | 
            -
                def  | 
| 20 | 
            -
                   | 
| 14 | 
            +
                def status
         | 
| 15 | 
            +
                  exists? ? "Available" : "Unknown"
         | 
| 21 16 | 
             
                end
         | 
| 22 17 |  | 
| 23 18 | 
             
                def deploy_failed?
         | 
| @@ -3,75 +3,46 @@ module KubernetesDeploy | |
| 3 3 | 
             
              class Cloudsql < KubernetesResource
         | 
| 4 4 | 
             
                TIMEOUT = 10.minutes
         | 
| 5 5 |  | 
| 6 | 
            -
                 | 
| 7 | 
            -
             | 
| 8 | 
            -
                   | 
| 9 | 
            -
                  @ | 
| 10 | 
            -
                  @ | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                  end
         | 
| 6 | 
            +
                SYNC_DEPENDENCIES = %w(Deployment Service)
         | 
| 7 | 
            +
                def sync(mediator)
         | 
| 8 | 
            +
                  super
         | 
| 9 | 
            +
                  @proxy_deployment = mediator.get_instance(Deployment.kind, "cloudsql-#{cloudsql_resource_uuid}")
         | 
| 10 | 
            +
                  @proxy_service = mediator.get_instance(Service.kind, "cloudsql-#{@name}")
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def status
         | 
| 14 | 
            +
                  deploy_succeeded? ? "Provisioned" : "Unknown"
         | 
| 16 15 | 
             
                end
         | 
| 17 16 |  | 
| 18 17 | 
             
                def deploy_succeeded?
         | 
| 19 | 
            -
                   | 
| 18 | 
            +
                  proxy_deployment_ready? && proxy_service_ready?
         | 
| 20 19 | 
             
                end
         | 
| 21 20 |  | 
| 22 21 | 
             
                def deploy_failed?
         | 
| 23 22 | 
             
                  false
         | 
| 24 23 | 
             
                end
         | 
| 25 24 |  | 
| 26 | 
            -
                def exists?
         | 
| 27 | 
            -
                  @found
         | 
| 28 | 
            -
                end
         | 
| 29 | 
            -
             | 
| 30 25 | 
             
                def deploy_method
         | 
| 31 26 | 
             
                  :replace
         | 
| 32 27 | 
             
                end
         | 
| 33 28 |  | 
| 34 29 | 
             
                private
         | 
| 35 30 |  | 
| 36 | 
            -
                def  | 
| 37 | 
            -
                   | 
| 38 | 
            -
             | 
| 39 | 
            -
                   | 
| 40 | 
            -
                    parsed = JSON.parse(deployment)
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                    if parsed.fetch("status", {}).fetch("availableReplicas", -1) == parsed.fetch("status", {}).fetch("replicas", 0)
         | 
| 43 | 
            -
                      # all cloudsql-proxy pods are running
         | 
| 44 | 
            -
                      return true
         | 
| 45 | 
            -
                    end
         | 
| 46 | 
            -
                  end
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                  false
         | 
| 31 | 
            +
                def proxy_deployment_ready?
         | 
| 32 | 
            +
                  return false unless status = @proxy_deployment["status"]
         | 
| 33 | 
            +
                  # all cloudsql-proxy pods are running
         | 
| 34 | 
            +
                  status.fetch("availableReplicas", -1) == status.fetch("replicas", 0)
         | 
| 49 35 | 
             
                end
         | 
| 50 36 |  | 
| 51 | 
            -
                def  | 
| 52 | 
            -
                   | 
| 53 | 
            -
             | 
| 54 | 
            -
                   | 
| 55 | 
            -
                    parsed = JSON.parse(service)
         | 
| 56 | 
            -
             | 
| 57 | 
            -
                    if parsed.dig("spec", "clusterIP").present?
         | 
| 58 | 
            -
                      # the service has an assigned cluster IP and is therefore functioning
         | 
| 59 | 
            -
                      return true
         | 
| 60 | 
            -
                    end
         | 
| 61 | 
            -
                  end
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                  false
         | 
| 37 | 
            +
                def proxy_service_ready?
         | 
| 38 | 
            +
                  return false unless @proxy_service.present?
         | 
| 39 | 
            +
                  # the service has an assigned cluster IP and is therefore functioning
         | 
| 40 | 
            +
                  @proxy_service.dig("spec", "clusterIP").present?
         | 
| 64 41 | 
             
                end
         | 
| 65 42 |  | 
| 66 43 | 
             
                def cloudsql_resource_uuid
         | 
| 67 | 
            -
                  return  | 
| 68 | 
            -
             | 
| 69 | 
            -
                  cloudsql, _err, st = kubectl.run("get", "cloudsqls", @name, "-o=json")
         | 
| 70 | 
            -
                  if st.success?
         | 
| 71 | 
            -
                    parsed = JSON.parse(cloudsql)
         | 
| 72 | 
            -
             | 
| 73 | 
            -
                    @cloudsql_resource_uuid = parsed.dig("metadata", "uid")
         | 
| 74 | 
            -
                  end
         | 
| 44 | 
            +
                  return unless @instance_data
         | 
| 45 | 
            +
                  @instance_data.dig("metadata", "uid")
         | 
| 75 46 | 
             
                end
         | 
| 76 47 | 
             
              end
         | 
| 77 48 | 
             
            end
         | 
| @@ -3,16 +3,14 @@ module KubernetesDeploy | |
| 3 3 | 
             
              class ConfigMap < KubernetesResource
         | 
| 4 4 | 
             
                TIMEOUT = 30.seconds
         | 
| 5 5 |  | 
| 6 | 
            -
                def sync
         | 
| 7 | 
            -
                  _, _err, st = kubectl.run("get", type, @name)
         | 
| 8 | 
            -
                  @status = st.success? ? "Available" : "Unknown"
         | 
| 9 | 
            -
                  @found = st.success?
         | 
| 10 | 
            -
                end
         | 
| 11 | 
            -
             | 
| 12 6 | 
             
                def deploy_succeeded?
         | 
| 13 7 | 
             
                  exists?
         | 
| 14 8 | 
             
                end
         | 
| 15 9 |  | 
| 10 | 
            +
                def status
         | 
| 11 | 
            +
                  exists? ? "Available" : "Unknown"
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 16 14 | 
             
                def deploy_failed?
         | 
| 17 15 | 
             
                  false
         | 
| 18 16 | 
             
                end
         | 
| @@ -20,9 +18,5 @@ module KubernetesDeploy | |
| 20 18 | 
             
                def timeout_message
         | 
| 21 19 | 
             
                  UNUSUAL_FAILURE_MESSAGE
         | 
| 22 20 | 
             
                end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                def exists?
         | 
| 25 | 
            -
                  @found
         | 
| 26 | 
            -
                end
         | 
| 27 21 | 
             
              end
         | 
| 28 22 | 
             
            end
         | 
| @@ -3,12 +3,6 @@ module KubernetesDeploy | |
| 3 3 | 
             
              class CronJob < KubernetesResource
         | 
| 4 4 | 
             
                TIMEOUT = 30.seconds
         | 
| 5 5 |  | 
| 6 | 
            -
                def sync
         | 
| 7 | 
            -
                  _, _err, st = kubectl.run("get", type, @name)
         | 
| 8 | 
            -
                  @status = st.success? ? "Available" : "Unknown"
         | 
| 9 | 
            -
                  @found = st.success?
         | 
| 10 | 
            -
                end
         | 
| 11 | 
            -
             | 
| 12 6 | 
             
                def deploy_succeeded?
         | 
| 13 7 | 
             
                  exists?
         | 
| 14 8 | 
             
                end
         | 
| @@ -20,9 +14,5 @@ module KubernetesDeploy | |
| 20 14 | 
             
                def timeout_message
         | 
| 21 15 | 
             
                  UNUSUAL_FAILURE_MESSAGE
         | 
| 22 16 | 
             
                end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                def exists?
         | 
| 25 | 
            -
                  @found
         | 
| 26 | 
            -
                end
         | 
| 27 17 | 
             
              end
         | 
| 28 18 | 
             
            end
         |