droplet_kit 2.6.1 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/README.md +34 -0
  4. data/lib/droplet_kit.rb +10 -0
  5. data/lib/droplet_kit/client.rb +2 -0
  6. data/lib/droplet_kit/mappings/kubernetes_cluster_mapping.rb +20 -0
  7. data/lib/droplet_kit/mappings/kubernetes_node_mapping.rb +15 -0
  8. data/lib/droplet_kit/mappings/kubernetes_node_pool_mapping.rb +27 -0
  9. data/lib/droplet_kit/mappings/kubernetes_options_mapping.rb +30 -0
  10. data/lib/droplet_kit/models/kubernetes_cluster.rb +7 -0
  11. data/lib/droplet_kit/models/kubernetes_node.rb +7 -0
  12. data/lib/droplet_kit/models/kubernetes_node_pool.rb +7 -0
  13. data/lib/droplet_kit/models/kubernetes_options.rb +7 -0
  14. data/lib/droplet_kit/resources/kubernetes_cluster_resource.rb +70 -0
  15. data/lib/droplet_kit/resources/kubernetes_options_resource.rb +10 -0
  16. data/lib/droplet_kit/version.rb +1 -1
  17. data/spec/fixtures/kubernetes/all.json +70 -0
  18. data/spec/fixtures/kubernetes/all_empty.json +7 -0
  19. data/spec/fixtures/kubernetes/cluster_node_pool.json +24 -0
  20. data/spec/fixtures/kubernetes/cluster_node_pool_create.json +40 -0
  21. data/spec/fixtures/kubernetes/cluster_node_pool_update.json +31 -0
  22. data/spec/fixtures/kubernetes/cluster_node_pools.json +33 -0
  23. data/spec/fixtures/kubernetes/clusters/create.json +65 -0
  24. data/spec/fixtures/kubernetes/clusters/find.json +65 -0
  25. data/spec/fixtures/kubernetes/clusters/kubeconfig.txt +20 -0
  26. data/spec/fixtures/kubernetes/clusters/update.json +63 -0
  27. data/spec/fixtures/kubernetes/options.json +150 -0
  28. data/spec/lib/droplet_kit/resources/kubernetes_cluster_resource_spec.rb +313 -0
  29. data/spec/lib/droplet_kit/resources/kubernetes_options_resource_spec.rb +33 -0
  30. data/test.rb +9 -0
  31. metadata +40 -3
@@ -0,0 +1,31 @@
1
+ {
2
+ "node_pool": {
3
+ "id": "0a209365-2fac-465e-a959-bb91f232923a",
4
+ "name": "backend",
5
+ "size": "s-1vcpu-1gb",
6
+ "count": 2,
7
+ "tags": [
8
+ "backend"
9
+ ],
10
+ "nodes": [
11
+ {
12
+ "id": "80118696-468e-4615-a5b6-33f1a659d116",
13
+ "name": "",
14
+ "status": {
15
+ "state": "provisioning"
16
+ },
17
+ "created_at": "2018-11-19T20:52:41Z",
18
+ "updated_at": "2018-11-19T20:52:41Z"
19
+ },
20
+ {
21
+ "id": "d1e2b1ff-a5d4-456c-b86a-ea28f53a47ad",
22
+ "name": "",
23
+ "status": {
24
+ "state": "provisioning"
25
+ },
26
+ "created_at": "2018-11-19T20:52:41Z",
27
+ "updated_at": "2018-11-19T20:52:41Z"
28
+ }
29
+ ]
30
+ }
31
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "node_pools": [
3
+ {
4
+ "id": "0a209365-2fac-465e-a959-bb91f232923a",
5
+ "name": "k8s-1-12-1-do-1-nyc1-1540837045848-1",
6
+ "size": "s-4vcpu-8gb",
7
+ "count": 2,
8
+ "tags": [
9
+ "omar-left-his-mark"
10
+ ],
11
+ "nodes": [
12
+ {
13
+ "id": "94bf2bde-e135-11e8-81bd-3cfdfe9e5ea0",
14
+ "name": "nostalgic-buck-5y1",
15
+ "status": {
16
+ "state": "running"
17
+ },
18
+ "created_at": "2018-10-29T18:17:48Z",
19
+ "updated_at": "2018-11-05T20:01:27Z"
20
+ },
21
+ {
22
+ "id": "94bf2c6f-e135-11e8-81bd-3cfdfe9e5ea0",
23
+ "name": "nostalgic-buck-5yz",
24
+ "status": {
25
+ "state": "running"
26
+ },
27
+ "created_at": "2018-10-29T18:17:48Z",
28
+ "updated_at": "2018-11-05T20:01:27Z"
29
+ }
30
+ ]
31
+ }
32
+ ]
33
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "kubernetes_cluster": {
3
+ "id": "cluster-1-id",
4
+ "name": "test-cluster",
5
+ "region": "nyc1",
6
+ "version": "1.12.1-do.2",
7
+ "cluster_subnet": "10.244.0.0/16",
8
+ "service_subnet": "",
9
+ "ipv4": "0.0.0.0",
10
+ "endpoint": "",
11
+ "tags": [
12
+ "test-k8",
13
+ "k8s",
14
+ "k8s:cluster-1-id"
15
+ ],
16
+ "node_pools": [
17
+ {
18
+ "id": "node-pool-id",
19
+ "name": "node-pool-1",
20
+ "size": "s-1vcpu-1gb",
21
+ "count": 3,
22
+ "tags": [
23
+ "k8s",
24
+ "k8s:node-pool-id",
25
+ "k8s:worker",
26
+ "test-k8"
27
+ ],
28
+ "nodes": [
29
+ {
30
+ "id": "node-1-id",
31
+ "name": "node-1",
32
+ "status": {
33
+ "state": "running"
34
+ },
35
+ "created_at": "2018-11-16T20:41:44Z",
36
+ "updated_at": "2018-11-16T20:44:27Z"
37
+ },
38
+ {
39
+ "id": "node-2-id",
40
+ "name": "node-2",
41
+ "status": {
42
+ "state": "running"
43
+ },
44
+ "created_at": "2018-11-16T20:41:44Z",
45
+ "updated_at": "2018-11-16T20:44:27Z"
46
+ },
47
+ {
48
+ "id": "node-3-id",
49
+ "name": "node-3",
50
+ "status": {
51
+ "state": "running"
52
+ },
53
+ "created_at": "2018-11-16T20:41:44Z",
54
+ "updated_at": "2018-11-16T20:44:27Z"
55
+ }
56
+ ]
57
+ }
58
+ ],
59
+ "status": {
60
+ "state": "running"
61
+ },
62
+ "created_at": "2018-11-16T20:41:43Z",
63
+ "updated_at": "2018-11-16T20:44:27Z"
64
+ }
65
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "kubernetes_cluster": {
3
+ "id": "cluster-1-id",
4
+ "name": "test-cluster",
5
+ "region": "nyc1",
6
+ "version": "1.12.1-do.2",
7
+ "cluster_subnet": "10.244.0.0/16",
8
+ "service_subnet": "",
9
+ "ipv4": "0.0.0.0",
10
+ "endpoint": "",
11
+ "tags": [
12
+ "test-k8",
13
+ "k8s",
14
+ "k8s:cluster-1-id"
15
+ ],
16
+ "node_pools": [
17
+ {
18
+ "id": "node-pool-id",
19
+ "name": "node-pool-1",
20
+ "size": "s-1vcpu-1gb",
21
+ "count": 3,
22
+ "tags": [
23
+ "k8s",
24
+ "k8s:node-pool-id",
25
+ "k8s:worker",
26
+ "test-k8"
27
+ ],
28
+ "nodes": [
29
+ {
30
+ "id": "node-1-id",
31
+ "name": "node-1",
32
+ "status": {
33
+ "state": "running"
34
+ },
35
+ "created_at": "2018-11-16T20:41:44Z",
36
+ "updated_at": "2018-11-16T20:44:27Z"
37
+ },
38
+ {
39
+ "id": "node-2-id",
40
+ "name": "node-2",
41
+ "status": {
42
+ "state": "running"
43
+ },
44
+ "created_at": "2018-11-16T20:41:44Z",
45
+ "updated_at": "2018-11-16T20:44:27Z"
46
+ },
47
+ {
48
+ "id": "node-3-id",
49
+ "name": "node-3",
50
+ "status": {
51
+ "state": "running"
52
+ },
53
+ "created_at": "2018-11-16T20:41:44Z",
54
+ "updated_at": "2018-11-16T20:44:27Z"
55
+ }
56
+ ]
57
+ }
58
+ ],
59
+ "status": {
60
+ "state": "running"
61
+ },
62
+ "created_at": "2018-11-16T20:41:43Z",
63
+ "updated_at": "2018-11-16T20:44:27Z"
64
+ }
65
+ }
@@ -0,0 +1,20 @@
1
+ apiVersion: v1
2
+ clusters:
3
+ - cluster:
4
+ certificate-authority-data: authoritydata
5
+ server: fake.server.do.com
6
+ name: do-nyc1-k8s-is-cool
7
+ contexts:
8
+ - context:
9
+ cluster: do-nyc1-k8s-is-cool
10
+ user: do-nyc1-k8s-is-cool-admin
11
+ name: do-nyc1-k8s-is-cool
12
+ current-context: do-nyc1-k8s-is-cool
13
+ kind: Config
14
+ preferences: {}
15
+ users:
16
+ - name: do-nyc1-k8s-is-cool-admin
17
+ user:
18
+ client-certificate-data: certificate-data=
19
+ client-key-data: data-key=
20
+
@@ -0,0 +1,63 @@
1
+ {
2
+ "kubernetes_cluster": {
3
+ "id": "cluster-1-id",
4
+ "name": "new-test-name",
5
+ "region": "nyc1",
6
+ "version": "1.12.1-do.2",
7
+ "cluster_subnet": "10.244.0.0/16",
8
+ "service_subnet": "",
9
+ "ipv4": "0.0.0.0",
10
+ "endpoint": "",
11
+ "tags": [
12
+ "new-test"
13
+ ],
14
+ "node_pools": [
15
+ {
16
+ "id": "node-pool-id",
17
+ "name": "node-pool-1",
18
+ "size": "s-1vcpu-1gb",
19
+ "count": 3,
20
+ "tags": [
21
+ "k8s",
22
+ "k8s:node-pool-id",
23
+ "k8s:worker",
24
+ "test-k8"
25
+ ],
26
+ "nodes": [
27
+ {
28
+ "id": "node-1-id",
29
+ "name": "node-1",
30
+ "status": {
31
+ "state": "running"
32
+ },
33
+ "created_at": "2018-11-16T20:41:44Z",
34
+ "updated_at": "2018-11-16T20:44:27Z"
35
+ },
36
+ {
37
+ "id": "node-2-id",
38
+ "name": "node-2",
39
+ "status": {
40
+ "state": "running"
41
+ },
42
+ "created_at": "2018-11-16T20:41:44Z",
43
+ "updated_at": "2018-11-16T20:44:27Z"
44
+ },
45
+ {
46
+ "id": "node-3-id",
47
+ "name": "node-3",
48
+ "status": {
49
+ "state": "running"
50
+ },
51
+ "created_at": "2018-11-16T20:41:44Z",
52
+ "updated_at": "2018-11-16T20:44:27Z"
53
+ }
54
+ ]
55
+ }
56
+ ],
57
+ "status": {
58
+ "state": "running"
59
+ },
60
+ "created_at": "2018-11-16T20:41:43Z",
61
+ "updated_at": "2018-11-16T20:44:27Z"
62
+ }
63
+ }
@@ -0,0 +1,150 @@
1
+ {
2
+ "options": {
3
+ "regions": [
4
+ {
5
+ "name": "New York 1",
6
+ "slug": "nyc1"
7
+ },
8
+ {
9
+ "name": "Amsterdam 1",
10
+ "slug": "ams1"
11
+ },
12
+ {
13
+ "name": "San Francisco 1",
14
+ "slug": "sfo1"
15
+ },
16
+ {
17
+ "name": "New York 2",
18
+ "slug": "nyc2"
19
+ },
20
+ {
21
+ "name": "Amsterdam 2",
22
+ "slug": "ams2"
23
+ },
24
+ {
25
+ "name": "Singapore 1",
26
+ "slug": "sgp1"
27
+ },
28
+ {
29
+ "name": "London 1",
30
+ "slug": "lon1"
31
+ },
32
+ {
33
+ "name": "New York 3",
34
+ "slug": "nyc3"
35
+ },
36
+ {
37
+ "name": "Amsterdam 3",
38
+ "slug": "ams3"
39
+ },
40
+ {
41
+ "name": "Frankfurt 1",
42
+ "slug": "fra1"
43
+ },
44
+ {
45
+ "name": "Toronto 1",
46
+ "slug": "tor1"
47
+ },
48
+ {
49
+ "name": "San Francisco 2",
50
+ "slug": "sfo2"
51
+ },
52
+ {
53
+ "name": "Bangalore 1",
54
+ "slug": "blr1"
55
+ }
56
+ ],
57
+ "versions": [
58
+ {
59
+ "slug": "1.13.0-do.not.use",
60
+ "kubernetes_version": "1.13.0"
61
+ },
62
+ {
63
+ "slug": "1.12.1-do.3",
64
+ "kubernetes_version": "1.12.1"
65
+ },
66
+ {
67
+ "slug": "1.12.1-do.2",
68
+ "kubernetes_version": "1.12.1"
69
+ },
70
+ {
71
+ "slug": "1.12.1-do.1",
72
+ "kubernetes_version": "1.12.1"
73
+ },
74
+ {
75
+ "slug": "1.11.1-do.2",
76
+ "kubernetes_version": "1.11.1"
77
+ },
78
+ {
79
+ "slug": "1.11.1-do.1",
80
+ "kubernetes_version": "1.11.1"
81
+ },
82
+ {
83
+ "slug": "1.10.7-gen2",
84
+ "kubernetes_version": "1.10.7"
85
+ },
86
+ {
87
+ "slug": "1.10.7-gen1",
88
+ "kubernetes_version": "1.10.7"
89
+ },
90
+ {
91
+ "slug": "1.10.7-gen0",
92
+ "kubernetes_version": "1.10.7"
93
+ }
94
+ ],
95
+ "sizes": [
96
+ {
97
+ "name": "s-1vcpu-1gb",
98
+ "slug": "s-1vcpu-1gb"
99
+ },
100
+ {
101
+ "name": "s-1vcpu-2gb",
102
+ "slug": "s-1vcpu-2gb"
103
+ },
104
+ {
105
+ "name": "s-1vcpu-3gb",
106
+ "slug": "s-1vcpu-3gb"
107
+ },
108
+ {
109
+ "name": "s-2vcpu-2gb",
110
+ "slug": "s-2vcpu-2gb"
111
+ },
112
+ {
113
+ "name": "s-3vcpu-1gb",
114
+ "slug": "s-3vcpu-1gb"
115
+ },
116
+ {
117
+ "name": "s-2vcpu-4gb",
118
+ "slug": "s-2vcpu-4gb"
119
+ },
120
+ {
121
+ "name": "c-2-4GiB",
122
+ "slug": "c-2"
123
+ },
124
+ {
125
+ "name": "s-4vcpu-8gb",
126
+ "slug": "s-4vcpu-8gb"
127
+ },
128
+ {
129
+ "name": "c-4-8GiB",
130
+ "slug": "c-4"
131
+ },
132
+ {
133
+ "name": "s-6vcpu-16gb",
134
+ "slug": "s-6vcpu-16gb"
135
+ },
136
+ {
137
+ "name": "c-8-16GiB",
138
+ "slug": "c-8"
139
+ },
140
+ {
141
+ "name": "s-8vcpu-32gb",
142
+ "slug": "s-8vcpu-32gb"
143
+ },
144
+ {
145
+ "name": "c-16",
146
+ "slug": "c-16"
147
+ }
148
+ ]
149
+ }
150
+ }
@@ -0,0 +1,313 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe DropletKit::KubernetesClusterResource do
4
+ subject(:resource) { described_class.new(connection: connection) }
5
+ let(:kubernetes_node_pool_attributes) { DropletKit::KubernetesNodePool.new.attributes }
6
+ let(:cluster_id) { "c28bf806-eba8-4a6d-a98f-8fd388740bd0" }
7
+ include_context 'resources'
8
+
9
+ describe '#find' do
10
+ it 'returns a singular cluster' do
11
+ stub_do_api('/v2/kubernetes/clusters/20', :get).to_return(body: api_fixture('kubernetes/clusters/find'))
12
+ cluster = resource.find(id: 20)
13
+ expect(cluster).to be_kind_of(DropletKit::KubernetesCluster)
14
+
15
+ expect(cluster.id).to eq("cluster-1-id")
16
+ expect(cluster.name).to eq("test-cluster")
17
+ expect(cluster.region).to eq("nyc1")
18
+ expect(cluster.version).to eq("1.12.1-do.2")
19
+ expect(cluster.cluster_subnet).to eq("10.244.0.0/16")
20
+ expect(cluster.ipv4).to eq("0.0.0.0")
21
+ expect(cluster.tags).to match_array(["test-k8", "k8s", "k8s:cluster-1-id"])
22
+ expect(cluster.node_pools.count).to eq(1)
23
+ end
24
+
25
+ it_behaves_like 'resource that handles common errors' do
26
+ let(:path) { '/v2/kubernetes/clusters/123' }
27
+ let(:method) { :get }
28
+ let(:action) { :find }
29
+ let(:arguments) { { id: 123 } }
30
+ end
31
+ end
32
+
33
+ describe '#update' do
34
+ let(:path) { '/v2/kubernetes/clusters' }
35
+ let(:new_attrs) do
36
+ {
37
+ "name" => "new-test-name",
38
+ "tags" => ["new-test"]
39
+ }
40
+ end
41
+
42
+ context 'for a successful update' do
43
+ it 'returns the created cluster' do
44
+ cluster = DropletKit::KubernetesCluster.new(new_attrs)
45
+
46
+ as_hash = DropletKit::KubernetesClusterMapping.hash_for(:update, cluster)
47
+ expect(as_hash['name']).to eq(cluster.name)
48
+ expect(as_hash['tags']).to eq(cluster.tags)
49
+
50
+
51
+ as_string = DropletKit::KubernetesClusterMapping.representation_for(:update, cluster)
52
+ stub_do_api(path, :put).with(body: as_string).to_return(body: api_fixture('kubernetes/clusters/update'), status: 202)
53
+
54
+ updated_cluster = resource.update(cluster)
55
+ expect(updated_cluster.name).to eq("new-test-name")
56
+ expect(updated_cluster.tags).to match_array(["new-test"])
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '#all' do
62
+ it 'returns all of the clusters' do
63
+ stub_do_api('/v2/kubernetes/clusters', :get).to_return(body: api_fixture('kubernetes/all'))
64
+ clusters = resource.all
65
+ expect(clusters).to all(be_kind_of(DropletKit::KubernetesCluster))
66
+
67
+ cluster = clusters.first
68
+
69
+ expect(cluster.id).to eq("cluster-1-id")
70
+ expect(cluster.name).to eq("test-cluster")
71
+ expect(cluster.region).to eq("nyc1")
72
+ expect(cluster.version).to eq("1.12.1-do.2")
73
+ expect(cluster.cluster_subnet).to eq("10.244.0.0/16")
74
+ expect(cluster.ipv4).to eq("0.0.0.0")
75
+ expect(cluster.tags).to match_array(["test-k8", "k8s", "k8s:cluster-1-id"])
76
+ expect(cluster.node_pools.count).to eq(1)
77
+ end
78
+
79
+ it 'returns an empty array of droplets' do
80
+ stub_do_api('/v2/kubernetes/clusters', :get).to_return(body: api_fixture('kubernetes/all_empty'))
81
+ clusters = resource.all.map(&:id)
82
+ expect(clusters).to be_empty
83
+ end
84
+
85
+ it_behaves_like 'a paginated index' do
86
+ let(:fixture_path) { 'kubernetes/all' }
87
+ let(:api_path) { '/v2/kubernetes/clusters' }
88
+ end
89
+ end
90
+
91
+ describe '#create' do
92
+ let(:path) { '/v2/kubernetes/clusters' }
93
+ let(:new_attrs) do
94
+ {
95
+ "name" => "test-cluster-01",
96
+ "region" => "nyc1",
97
+ "version" => "1.12.1-do.2",
98
+ "tags" => ["test"],
99
+ "node_pools" => [
100
+ {
101
+ "size" => "s-1vcpu-1gb",
102
+ "count" => 3,
103
+ "name" => "frontend-pool",
104
+ "tags" => ["frontend"]
105
+ },
106
+ {
107
+ "size" => "c-4",
108
+ "count" => 2,
109
+ "name" => "backend-pool"
110
+ }
111
+ ]
112
+ }
113
+ end
114
+
115
+ context 'for a successful create' do
116
+ it 'returns the created cluster' do
117
+ cluster = DropletKit::KubernetesCluster.new(new_attrs)
118
+
119
+ as_hash = DropletKit::KubernetesClusterMapping.hash_for(:create, cluster)
120
+ expect(as_hash['name']).to eq(cluster.name)
121
+ expect(as_hash['region']).to eq(cluster.region)
122
+ expect(as_hash['version']).to eq(cluster.version)
123
+ expect(as_hash['tags']).to eq(cluster.tags)
124
+ expect(as_hash['node_pools']).to eq(cluster.node_pools)
125
+
126
+
127
+ as_string = DropletKit::KubernetesClusterMapping.representation_for(:create, cluster)
128
+ stub_do_api(path, :post).with(body: as_string).to_return(body: api_fixture('kubernetes/clusters/create'), status: 201)
129
+ created_cluster = resource.create(cluster)
130
+ expect(cluster.id).to eq("cluster-1-id")
131
+ expect(cluster.name).to eq("test-cluster")
132
+ expect(cluster.region).to eq("nyc1")
133
+ expect(cluster.version).to eq("1.12.1-do.2")
134
+ expect(cluster.cluster_subnet).to eq("10.244.0.0/16")
135
+ expect(cluster.ipv4).to eq("0.0.0.0")
136
+ expect(cluster.tags).to match_array(["test-k8", "k8s", "k8s:cluster-1-id"])
137
+ expect(cluster.node_pools.count).to eq(1)
138
+ end
139
+
140
+ it 'reuses the same object' do
141
+ cluster = DropletKit::KubernetesCluster.new(new_attrs)
142
+
143
+ json = DropletKit::KubernetesClusterMapping.representation_for(:create, cluster)
144
+ stub_do_api(path, :post).with(body: json).to_return(body: api_fixture('kubernetes/clusters/create'), status: 201)
145
+ created_cluster = resource.create(cluster)
146
+ expect(created_cluster).to be cluster
147
+ end
148
+ end
149
+
150
+ it_behaves_like 'an action that handles invalid parameters' do
151
+ let(:action) { 'create' }
152
+ let(:arguments) { DropletKit::KubernetesCluster.new }
153
+ end
154
+ end
155
+
156
+ describe '#delete' do
157
+ it 'sends a delete request for a cluster' do
158
+ request = stub_do_api('/v2/kubernetes/clusters/23', :delete).to_return(status: 202)
159
+ response = resource.delete(id: 23)
160
+
161
+ expect(request).to have_been_made
162
+ expect(response).to eq(true)
163
+ end
164
+ end
165
+
166
+ describe '#kubeconfig' do
167
+ it 'returns a yaml string kubeconfig' do
168
+ response = Pathname.new('./spec/fixtures/kubernetes/clusters/kubeconfig.txt').read
169
+
170
+ stub_do_api('/v2/kubernetes/clusters/1/kubeconfig', :get).to_return(body: response)
171
+
172
+ kubeconfig = resource.kubeconfig(id: '1')
173
+
174
+ expect(kubeconfig).to be_kind_of(String)
175
+
176
+ parsed_config = YAML.load(kubeconfig)
177
+ expect(parsed_config.keys).to match_array(["apiVersion", "clusters", "contexts", "current-context", "kind", "preferences", "users"])
178
+ end
179
+ end
180
+
181
+ describe "node_pools" do
182
+ it 'returns the node_pools for a cluster' do
183
+ stub_do_api("/v2/kubernetes/clusters/#{cluster_id}/node_pools", :get).to_return(body: api_fixture('kubernetes/cluster_node_pools'))
184
+ node_pools= resource.node_pools(id: cluster_id)
185
+ node_pools.each do |pool|
186
+ expect(pool).to be_kind_of(DropletKit::KubernetesNodePool)
187
+ expect(pool.attributes.keys).to eq kubernetes_node_pool_attributes.keys
188
+ end
189
+ expect(node_pools.length).to eq 1
190
+ expect(node_pools.first["id"]).to eq "0a209365-2fac-465e-a959-bb91f232923a"
191
+ expect(node_pools.first["name"]).to eq "k8s-1-12-1-do-1-nyc1-1540837045848-1"
192
+ expect(node_pools.first["size"]).to eq "s-4vcpu-8gb"
193
+ expect(node_pools.first["count"]).to eq 2
194
+ expect(node_pools.first["tags"]).to eq [ "omar-left-his-mark" ]
195
+ expect(node_pools.first["nodes"].length).to eq 2
196
+ end
197
+ end
198
+
199
+ describe "find_node_pool" do
200
+ it "should return a single node pool" do
201
+ node_pool_id = "f9f16e5a-83b8-4c9b-acf1-4f91492a6652"
202
+ stub_do_api("/v2/kubernetes/clusters/#{cluster_id}/node_pools/#{node_pool_id}", :get).to_return(body: api_fixture('kubernetes/cluster_node_pool'))
203
+ node_pool = resource.find_node_pool(id: cluster_id, pool_id: node_pool_id)
204
+
205
+ expect(node_pool.id).to eq node_pool_id
206
+ expect(node_pool.name).to eq "k8s-1-12-1-do-2-nyc1-1542638764614-1"
207
+ expect(node_pool.size).to eq "s-1vcpu-1gb"
208
+ expect(node_pool.count).to eq 1
209
+ expect(node_pool.tags).to eq ["k8s", "k8s:c28bf806-eba8-4a6d-a98f-8fd388740bd0", "k8s:worker"]
210
+ expect(node_pool.nodes.length).to eq 1
211
+ expect(node_pool.nodes.first.name).to eq "blissful-antonelli-3u87"
212
+ expect(node_pool.nodes.first.status['state']).to eq "running"
213
+ end
214
+ end
215
+
216
+ describe "create_node_pool" do
217
+ it 'should create a node_pool in a cluster' do
218
+ node_pool = DropletKit::KubernetesNodePool.new(
219
+ name: 'frontend',
220
+ size: 's-1vcpu-1gb',
221
+ count: 3,
222
+ tags: ['k8-tag']
223
+ )
224
+ as_hash = DropletKit::KubernetesNodePoolMapping.hash_for(:create, node_pool)
225
+ expect(as_hash['name']).to eq(node_pool.name)
226
+ expect(as_hash['size']).to eq(node_pool.size)
227
+ expect(as_hash['count']).to eq(node_pool.count)
228
+ expect(as_hash['tags']).to eq(node_pool.tags)
229
+
230
+ as_string = DropletKit::KubernetesNodePoolMapping.representation_for(:create, node_pool)
231
+ stub_do_api("/v2/kubernetes/clusters/#{cluster_id}/node_pools", :post).with(body: as_string).to_return(body: api_fixture('kubernetes/cluster_node_pool_create'), status: 201)
232
+ new_node_pool = resource.create_node_pool(node_pool, id: cluster_id)
233
+
234
+ expect(new_node_pool).to be_kind_of(DropletKit::KubernetesNodePool)
235
+ expect(new_node_pool.name).to eq 'frontend'
236
+ expect(new_node_pool.size).to eq 's-1vcpu-1gb'
237
+ expect(new_node_pool.count).to eq 3
238
+ expect(new_node_pool.tags).to eq ['k8-tag']
239
+ expect(new_node_pool.nodes.length).to eq 3
240
+ new_node_pool.nodes.each do |node|
241
+ expect(node['name']).to eq ""
242
+ expect(node['status']['state']).to eq 'provisioning'
243
+ end
244
+ end
245
+ end
246
+
247
+ describe "update_node_pool" do
248
+ it "should update an existing node_pool" do
249
+ stub_do_api("/v2/kubernetes/clusters/#{cluster_id}/node_pools", :get).to_return(body: api_fixture('kubernetes/cluster_node_pools'))
250
+ node_pools = resource.node_pools(id: cluster_id)
251
+ node_pools.each do |pool|
252
+ expect(pool).to be_kind_of(DropletKit::KubernetesNodePool)
253
+ end
254
+ node_pool_id = "0a209365-2fac-465e-a959-bb91f232923a"
255
+ expect(node_pools.length).to eq 1
256
+ expect(node_pools.first["id"]).to eq node_pool_id
257
+ expect(node_pools.first["name"]).to eq "k8s-1-12-1-do-1-nyc1-1540837045848-1"
258
+ expect(node_pools.first["size"]).to eq "s-4vcpu-8gb"
259
+ expect(node_pools.first["count"]).to eq 2
260
+ expect(node_pools.first["tags"]).to eq [ "omar-left-his-mark" ]
261
+
262
+ node_pool = node_pools.first
263
+ node_pool.name = 'backend'
264
+ node_pool.size = 's-1vcpu-1gb'
265
+ node_pool.count = 2
266
+ node_pool.tags = ['updated-k8-tag']
267
+ as_string = DropletKit::KubernetesNodePoolMapping.representation_for(:update, node_pool)
268
+ stub_do_api("/v2/kubernetes/clusters/#{cluster_id}/node_pools/#{node_pool_id}", :put).with(body: as_string).to_return(body: api_fixture('kubernetes/cluster_node_pool_update'), status: 202)
269
+ updated_node_pool = resource.update_node_pool(node_pool, id: cluster_id, pool_id: node_pool_id)
270
+
271
+ expect(updated_node_pool.id).to eq node_pool_id
272
+ expect(updated_node_pool.name).to eq 'backend'
273
+ expect(updated_node_pool.size).to eq 's-1vcpu-1gb'
274
+ expect(updated_node_pool.count).to eq 2
275
+ expect(updated_node_pool.tags).to eq ['backend']
276
+ expect(updated_node_pool.nodes.length).to eq 2
277
+ end
278
+ end
279
+
280
+ describe 'delete_node_pool' do
281
+ it 'should delete a clusters node_pool' do
282
+ node_pool_id = "f9f16e5a-83b8-4c9b-acf1-4f91492a6652"
283
+ stub_do_api("/v2/kubernetes/clusters/#{cluster_id}/node_pools/#{node_pool_id}", :delete).to_return(status: 202)
284
+ deleted_node_pool = resource.delete_node_pool(id: cluster_id, pool_id: node_pool_id)
285
+
286
+ expect(deleted_node_pool).to eq true
287
+ end
288
+ end
289
+
290
+ describe 'recycle_node_pool' do
291
+ it 'should recycle the clusters node_pool' do
292
+ stub_do_api("/v2/kubernetes/clusters/#{cluster_id}/node_pools", :get).to_return(body: api_fixture('kubernetes/cluster_node_pools'))
293
+ node_pools = resource.node_pools(id: cluster_id)
294
+ node_pools.each do |pool|
295
+ expect(pool).to be_kind_of(DropletKit::KubernetesNodePool)
296
+ end
297
+ node_pool_id = "0a209365-2fac-465e-a959-bb91f232923a"
298
+ expect(node_pools.length).to eq 1
299
+ expect(node_pools.first["id"]).to eq node_pool_id
300
+ expect(node_pools.first["name"]).to eq "k8s-1-12-1-do-1-nyc1-1540837045848-1"
301
+ expect(node_pools.first["count"]).to eq 2
302
+
303
+ nodes = node_pools.first.nodes
304
+ expect(nodes.length).to eq 2
305
+ node_ids = nodes.map(&:id)
306
+ recycle_json = { nodes: node_ids}.to_json
307
+ stub_do_api("/v2/kubernetes/clusters/#{cluster_id}/node_pools/#{node_pool_id}/recycle", :post).with(body: recycle_json).to_return(status: 202)
308
+ response = resource.recycle_node_pool(node_ids, id: cluster_id, pool_id: node_pool_id)
309
+
310
+ expect(response).to eq true
311
+ end
312
+ end
313
+ end