From b60dcfda4bee4b8b9ab7b330bfb5e61e6dc62414 Mon Sep 17 00:00:00 2001 From: Sun-Li Beatteay Date: Thu, 7 Oct 2021 16:27:19 -0400 Subject: [PATCH] K8s: add ha and supported_features fields (#283) * droplet_kit/k8s: add supported_features options and cluster ha fields * add node_pool mapping to allow both hases and NodePool instances * fix tests --- .../mappings/kubernetes_cluster_mapping.rb | 1 + .../mappings/kubernetes_options_mapping.rb | 3 +- lib/droplet_kit/models/kubernetes_cluster.rb | 2 +- .../resources/kubernetes_cluster_resource.rb | 15 ++++- spec/fixtures/kubernetes/clusters/find.json | 1 + spec/fixtures/kubernetes/options.json | 64 ++++++++++++++++--- .../kubernetes_cluster_resource_spec.rb | 1 + .../kubernetes_options_resource_spec.rb | 1 + 8 files changed, 76 insertions(+), 12 deletions(-) diff --git a/lib/droplet_kit/mappings/kubernetes_cluster_mapping.rb b/lib/droplet_kit/mappings/kubernetes_cluster_mapping.rb index 8a4a5e84..6aae7e86 100644 --- a/lib/droplet_kit/mappings/kubernetes_cluster_mapping.rb +++ b/lib/droplet_kit/mappings/kubernetes_cluster_mapping.rb @@ -18,6 +18,7 @@ class KubernetesClusterMapping property :maintenance_policy, scopes: [:read, :update, :create] property :node_pools, scopes: [:read, :create] property :vpc_uuid, scopes: [:read, :create] + property :ha, scopes: [:read, :create] end end end diff --git a/lib/droplet_kit/mappings/kubernetes_options_mapping.rb b/lib/droplet_kit/mappings/kubernetes_options_mapping.rb index fe972dc1..a0f64679 100644 --- a/lib/droplet_kit/mappings/kubernetes_options_mapping.rb +++ b/lib/droplet_kit/mappings/kubernetes_options_mapping.rb @@ -5,11 +5,12 @@ class KubernetesOptionsMapping mapping KubernetesOptions root_key singular: 'options', scopes: [:read] - Version = Struct.new(:slug, :kubernetes_version) + Version = Struct.new(:slug, :kubernetes_version, :supported_features) property :versions, plural: true, scopes: [:read] do mapping Version property :slug, scopes: [:read] property :kubernetes_version, scopes: [:read] + property :supported_features, scopes: [:read] end Region = Struct.new(:name, :slug) diff --git a/lib/droplet_kit/models/kubernetes_cluster.rb b/lib/droplet_kit/models/kubernetes_cluster.rb index bed0c86d..88cf55ee 100644 --- a/lib/droplet_kit/models/kubernetes_cluster.rb +++ b/lib/droplet_kit/models/kubernetes_cluster.rb @@ -1,6 +1,6 @@ module DropletKit class KubernetesCluster < BaseModel - [:id, :name, :region, :version, :auto_upgrade, :cluster_subnet, :service_subnet, :ipv4, :endpoint, :tags, :maintenance_policy, :node_pools, :vpc_uuid].each do |key| + [:id, :name, :region, :version, :auto_upgrade, :cluster_subnet, :service_subnet, :ipv4, :endpoint, :tags, :maintenance_policy, :node_pools, :vpc_uuid, :ha].each do |key| attribute(key) end end diff --git a/lib/droplet_kit/resources/kubernetes_cluster_resource.rb b/lib/droplet_kit/resources/kubernetes_cluster_resource.rb index d813723f..1322094c 100644 --- a/lib/droplet_kit/resources/kubernetes_cluster_resource.rb +++ b/lib/droplet_kit/resources/kubernetes_cluster_resource.rb @@ -13,7 +13,20 @@ class KubernetesClusterResource < ResourceKit::Resource end action :create, 'POST /v2/kubernetes/clusters' do - body { |object| KubernetesClusterMapping.representation_for(:create, object) } + body do |object| + # This ensures that both a hash and an instance of KubernetesNodePool can be passed + # into the node_pools array + # + # Ex: + # KubernetesCluster.new(node_pools: [{}]) + # or + # KubernetesCluster.new(node_pools: [KubernetesNodePool.new()]) + if object.respond_to?(:node_pools) && object.node_pools.respond_to?(:map) + object.node_pools = object.node_pools.map(&:to_hash) + end + + KubernetesClusterMapping.representation_for(:create, object) + end handler(201) { |response, cluster| KubernetesClusterMapping.extract_into_object(cluster, response.body, :read) } handler(422) { |response| ErrorMapping.fail_with(FailedCreate, response.body) } end diff --git a/spec/fixtures/kubernetes/clusters/find.json b/spec/fixtures/kubernetes/clusters/find.json index 795c2413..ea8f1ed7 100644 --- a/spec/fixtures/kubernetes/clusters/find.json +++ b/spec/fixtures/kubernetes/clusters/find.json @@ -8,6 +8,7 @@ "cluster_subnet": "10.244.0.0/16", "service_subnet": "", "ipv4": "0.0.0.0", + "ha": true, "endpoint": "", "tags": [ "test-k8", diff --git a/spec/fixtures/kubernetes/options.json b/spec/fixtures/kubernetes/options.json index 92d47ddf..da83baba 100644 --- a/spec/fixtures/kubernetes/options.json +++ b/spec/fixtures/kubernetes/options.json @@ -57,39 +57,85 @@ "versions": [ { "slug": "1.13.0-do.not.use", - "kubernetes_version": "1.13.0" + "kubernetes_version": "1.13.0", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "ha-control-plane", + "token-authentication" + ] }, { "slug": "1.12.1-do.3", - "kubernetes_version": "1.12.1" + "kubernetes_version": "1.12.1", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] }, { "slug": "1.12.1-do.2", - "kubernetes_version": "1.12.1" + "kubernetes_version": "1.12.1", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] }, { "slug": "1.12.1-do.1", - "kubernetes_version": "1.12.1" + "kubernetes_version": "1.12.1", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] }, { "slug": "1.11.1-do.2", - "kubernetes_version": "1.11.1" + "kubernetes_version": "1.11.1", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] }, { "slug": "1.11.1-do.1", - "kubernetes_version": "1.11.1" + "kubernetes_version": "1.11.1", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] }, { "slug": "1.10.7-gen2", - "kubernetes_version": "1.10.7" + "kubernetes_version": "1.10.7", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] }, { "slug": "1.10.7-gen1", - "kubernetes_version": "1.10.7" + "kubernetes_version": "1.10.7", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] }, { "slug": "1.10.7-gen0", - "kubernetes_version": "1.10.7" + "kubernetes_version": "1.10.7", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] } ], "sizes": [ diff --git a/spec/lib/droplet_kit/resources/kubernetes_cluster_resource_spec.rb b/spec/lib/droplet_kit/resources/kubernetes_cluster_resource_spec.rb index fa3c3de8..2d323501 100644 --- a/spec/lib/droplet_kit/resources/kubernetes_cluster_resource_spec.rb +++ b/spec/lib/droplet_kit/resources/kubernetes_cluster_resource_spec.rb @@ -18,6 +18,7 @@ expect(cluster.region).to eq("nyc1") expect(cluster.version).to eq("1.12.1-do.2") expect(cluster.auto_upgrade).to eq(true) + expect(cluster.ha).to eq(true) expect(cluster.cluster_subnet).to eq("10.244.0.0/16") expect(cluster.ipv4).to eq("0.0.0.0") expect(cluster.tags).to match_array(["test-k8", "k8s", "k8s:cluster-1-id"]) diff --git a/spec/lib/droplet_kit/resources/kubernetes_options_resource_spec.rb b/spec/lib/droplet_kit/resources/kubernetes_options_resource_spec.rb index 1299aae9..4ff28650 100644 --- a/spec/lib/droplet_kit/resources/kubernetes_options_resource_spec.rb +++ b/spec/lib/droplet_kit/resources/kubernetes_options_resource_spec.rb @@ -14,6 +14,7 @@ expect(version).to be_kind_of(DropletKit::KubernetesOptionsMapping::Version) expect(version.slug).to be_present expect(version.kubernetes_version).to be_present + expect(version.supported_features).to be_present end expect(options.regions.length).to eq 13 options.regions.each do |region|