Skip to content

Commit d515d0e

Browse files
committed
Add support for GCP tests
- Implement GCPDeployer/GCPDestroyer classes for infrastructure deployment/teardown - Add playbooks to configure server/client instances - Edit install.py to upload couchbase.rpm to client instances too when --remote-copy is passed (for tools tests, the client needs this too) - Provide ability to use internal/private IPs when setting up couchbase cluster, since GCP instances cannot be renamed to their external/public IP addresses Change-Id: I0f8b96a807d26eee9568254bc041741cd149c6c9 Reviewed-on: https://review.couchbase.org/c/perfrunner/+/169032 Tested-by: Build Bot <[email protected]> Reviewed-by: Korrigan Clark <[email protected]>
1 parent 4bdf2f7 commit d515d0e

File tree

10 files changed

+888
-10
lines changed

10 files changed

+888
-10
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
[infrastructure]
2+
provider = gcp
3+
type = gce
4+
5+
[clusters]
6+
couchbase1 =
7+
gce.gce_cluster_1.gce_node_group_1.1:kv
8+
gce.gce_cluster_1.gce_node_group_1.2:kv
9+
gce.gce_cluster_1.gce_node_group_1.3:kv
10+
gce.gce_cluster_1.gce_node_group_1.4:kv
11+
12+
[clients]
13+
workers1 =
14+
gce.gce_cluster_1.gce_node_group_2.1
15+
16+
[utilities]
17+
brokers1 = gce.gce_cluster_1.gce_node_group_3.1
18+
19+
[gce]
20+
clusters = gce_cluster_1
21+
22+
[gce_cluster_1]
23+
node_groups = gce_node_group_1,gce_node_group_2,gce_node_group_3
24+
storage_class = pd-extreme
25+
26+
[gce_node_group_1]
27+
instance_type = n2d-standard-16
28+
instance_capacity = 4
29+
volume_size = 1000
30+
volume_type = pd-extreme
31+
iops = 20000
32+
33+
[gce_node_group_2]
34+
instance_type = n2-standard-32
35+
instance_capacity = 1
36+
volume_size = 1000
37+
volume_type = pd-extreme
38+
iops = 20000
39+
40+
[gce_node_group_3]
41+
instance_type = n2-standard-32
42+
instance_capacity = 1
43+
44+
[storage]
45+
data = /data
46+
backup = gs://perftest-gcp-backup
47+
48+
[credentials]
49+
rest = Administrator:password
50+
ssh = root:couchbase
51+
52+
[parameters]
53+
OS = CentOS 7
54+
CPU = 16vCPU
55+
Memory = 64GB
56+
Disk = pd-extreme 1TB 20000 IOPS

perfrunner/helpers/cluster.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ def set_analytics_path(self):
6363
def rename(self):
6464
if self.dynamic_infra:
6565
return
66+
elif self.cluster_spec.cloud_infrastructure:
67+
if self.cluster_spec.cloud_provider == 'gcp':
68+
clusters_private = dict(self.cluster_spec.clusters_private)
69+
for cluster_name, public_ips in self.cluster_spec.clusters:
70+
private_ips = clusters_private.get(cluster_name, [])
71+
for host, new_host in zip(public_ips, private_ips):
72+
self.rest.rename(host, new_host)
6673
else:
6774
for server in self.cluster_spec.servers:
6875
self.rest.rename(server)
@@ -236,15 +243,23 @@ def set_services(self):
236243
def add_nodes(self):
237244
if self.dynamic_infra:
238245
return
239-
for (_, servers), initial_nodes in zip(self.cluster_spec.clusters, self.initial_nodes):
246+
247+
using_gcp = self.cluster_spec.cloud_provider == 'gcp'
248+
249+
for (cluster, servers), initial_nodes in zip(self.cluster_spec.clusters,
250+
self.initial_nodes):
240251

241252
if initial_nodes < 2: # Single-node cluster
242253
continue
243254

255+
if using_gcp:
256+
private_ips = dict(self.cluster_spec.clusters_private)[cluster]
257+
244258
master = servers[0]
245-
for node in servers[1:initial_nodes]:
259+
for i, node in enumerate(servers[1:initial_nodes]):
246260
roles = self.cluster_spec.roles[node]
247-
self.rest.add_node(master, node, roles)
261+
new_host = private_ips[1:initial_nodes][i] if using_gcp else node
262+
self.rest.add_node(master, new_host, roles)
248263

249264
def rebalance(self):
250265
if self.dynamic_infra:

perfrunner/helpers/rest.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,14 @@ def set_auth(self, host: str):
128128
}
129129
self.post(url=api, data=data)
130130

131-
def rename(self, host: str):
132-
logger.info('Changing server name: {}'.format(host))
131+
def rename(self, host: str, new_host: str = None):
132+
if not new_host:
133+
new_host = host
134+
135+
logger.info('Changing server name: {} -> {}'.format(host, new_host))
133136

134137
api = 'http://{}:8091/node/controller/rename'.format(host)
135-
data = {'hostname': host}
138+
data = {'hostname': new_host}
136139

137140
self.post(url=api, data=data)
138141

perfrunner/settings.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ def cloud_infrastructure(self):
7272
else:
7373
return False
7474

75+
@property
76+
def cloud_provider(self):
77+
return self.config.get('infrastructure', 'provider', fallback='')
78+
7579
@property
7680
def kubernetes_infrastructure(self):
7781
if self.cloud_infrastructure:
@@ -152,6 +156,12 @@ def servers(self) -> List[str]:
152156
servers.append(server)
153157
return servers
154158

159+
@property
160+
def clusters_private(self) -> Iterator:
161+
if self.config.has_section('private_ips'):
162+
for cluster_name, private_ips in self.config.items('private_ips'):
163+
yield cluster_name, private_ips.split()
164+
155165
def servers_by_role(self, role: str) -> List[str]:
156166
has_service = []
157167
for _, servers in self.config.items('clusters'):

0 commit comments

Comments
 (0)