@@ -6,68 +6,91 @@ def GenerateConfig(context):
6
6
project = context .env ['project' ]
7
7
zone = context .properties ['zone' ]
8
8
machineType = context .properties ['machineType' ]
9
+ image = context .properties ['image' ]
9
10
network = '$(ref.' + context .properties ['network' ] + '.selfLink)'
10
11
11
12
script = r"""
12
13
#!/bin/bash
13
14
set -x
14
15
15
16
service docker start
16
- docker swarm init --advertise-addr ens4 :2377 --listen-addr ens4 :2377
17
+ docker swarm init --advertise-addr eth0 :2377 --listen-addr eth0 :2377
17
18
18
- TOKEN=$(docker swarm join-token worker -q)
19
19
PROJECT=$(curl -s http://metadata.google.internal/computeMetadata/v1/project/project-id -H "Metadata-Flavor: Google")
20
20
ACCESS_TOKEN=$(curl -s http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token -H "Metadata-Flavor: Google" | jq -r ".access_token")
21
21
22
- curl -s -X PUT -H "Content-Type: application/json" -d "{\"text\":\"${TOKEN}\"}" https://runtimeconfig.googleapis.com/v1beta1/projects/${PROJECT}/configs/swarm-config/variables/token -H "Authorization":"Bearer ${ACCESS_TOKEN}"
23
- "" "
22
+ LEADER_IP=$( curl -s http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip -H "Metadata-Flavor: Google")
23
+ curl -f -s -X POST -H "Content-Type: application/json" -d "{'name':'projects/${PROJECT}/configs/swarm-config/variables/leader-ip','text':'${LEADER_IP}'}" https://runtimeconfig.googleapis.com/v1beta1/projects/${PROJECT}/configs/swarm-config/variables -H "Authorization":"Bearer ${ACCESS_TOKEN} "
24
24
25
- outputs = [{
26
- 'name' : 'internalIP' ,
27
- 'value' : '$(ref.' + context .env ['name' ] + '.networkInterfaces[0].networkIP)'
28
- }]
25
+ if [ $? -eq 0 ]; then
26
+ echo "I'm a leader"
27
+
28
+ WORKER_TOKEN=$(docker swarm join-token worker -q)
29
+ curl -s -X POST -H "Content-Type: application/json" -d "{'name':'projects/${PROJECT}/configs/swarm-config/variables/worker-token','text':'${WORKER_TOKEN}'}" https://runtimeconfig.googleapis.com/v1beta1/projects/${PROJECT}/configs/swarm-config/variables -H "Authorization":"Bearer ${ACCESS_TOKEN}"
30
+
31
+ MANAGER_TOKEN=$(docker swarm join-token manager -q)
32
+ curl -s -X POST -H "Content-Type: application/json" -d "{'name':'projects/${PROJECT}/configs/swarm-config/variables/manager-token','text':'${MANAGER_TOKEN}'}" https://runtimeconfig.googleapis.com/v1beta1/projects/${PROJECT}/configs/swarm-config/variables -H "Authorization":"Bearer ${ACCESS_TOKEN}"
33
+ else
34
+ echo "I'm not a leader"
35
+
36
+ docker swarm leave --force
37
+
38
+ for i in $(seq 1 300); do
39
+ LEADER_IP=$(curl -sSL "https://runtimeconfig.googleapis.com/v1beta1/projects/${PROJECT}/configs/swarm-config/variables/leader-ip" -H "Authorization":"Bearer ${ACCESS_TOKEN}" | jq -r ".text // empty")
40
+ if [ ! -z "${LEADER_IP}" ]; then
41
+ TOKEN=$(curl -sSL "https://runtimeconfig.googleapis.com/v1beta1/projects/${PROJECT}/configs/swarm-config/variables/manager-token" -H "Authorization":"Bearer ${ACCESS_TOKEN}" | jq -r ".text // empty")
42
+ docker swarm join --token "${TOKEN}" "${LEADER_IP}" --advertise-addr eth0:2377 --listen-addr eth0:2377
43
+ break
44
+ fi
45
+
46
+ sleep 1
47
+ done
48
+ fi
49
+ """
29
50
30
51
resources = [{
31
52
'name' : context .env ['name' ],
32
- 'type' : 'compute.v1.instance ' ,
53
+ 'type' : 'compute.v1.instanceTemplate ' ,
33
54
'properties' : {
34
- 'zone' : zone ,
35
- 'tags' : {
36
- 'items' : ['swarm' , 'swarm-manager' ]
37
- },
38
- 'machineType' : '/' .join (['projects' , project ,
39
- 'zones' , zone ,
40
- 'machineTypes' , machineType ]),
41
- 'disks' : [{
42
- 'deviceName' : 'boot' ,
43
- 'type' : 'PERSISTENT' ,
44
- 'boot' : True ,
45
- 'autoDelete' : True ,
46
- 'initializeParams' : {
47
- 'sourceImage' : '/' .join (['projects' , project ,
48
- 'global' ,
49
- 'images' , 'docker2' ])
50
- }
51
- }],
52
- 'networkInterfaces' : [{
53
- 'network' : network ,
54
- 'accessConfigs' : [{
55
- 'name' : 'External NAT' ,
56
- 'type' : 'ONE_TO_ONE_NAT'
55
+ 'properties' : {
56
+ 'zone' : zone ,
57
+ 'machineType' : machineType ,
58
+ 'tags' : {
59
+ 'items' : ['swarm' , 'swarm-manager' ]
60
+ },
61
+ 'disks' : [{
62
+ 'deviceName' : 'boot' ,
63
+ 'type' : 'PERSISTENT' ,
64
+ 'boot' : True ,
65
+ 'autoDelete' : True ,
66
+ 'initializeParams' : {
67
+ 'sourceImage' : image
68
+ }
69
+ }],
70
+ 'networkInterfaces' : [{
71
+ 'network' : network ,
72
+ 'accessConfigs' : [{
73
+ 'name' : 'External NAT' ,
74
+ 'type' : 'ONE_TO_ONE_NAT'
75
+ }]
76
+ }],
77
+ 'metadata' : {
78
+ 'items' : [{
79
+ 'key' : 'startup-script' ,
80
+ 'value' : script
81
+ }]
82
+ },
83
+ 'scheduling' : {
84
+ 'preemptible' : False ,
85
+ 'onHostMaintenance' : 'TERMINATE' ,
86
+ 'automaticRestart' : False
87
+ },
88
+ 'serviceAccounts' : [{
89
+ 'scopes' : [
90
+ 'https://www.googleapis.com/auth/cloudruntimeconfig'
91
+ ]
57
92
}]
58
- }],
59
- 'metadata' : {
60
- 'items' : [{
61
- 'key' : 'startup-script' ,
62
- 'value' : script
63
- }]
64
- },
65
- 'serviceAccounts' : [{
66
- 'scopes' : [
67
- 'https://www.googleapis.com/auth/cloudruntimeconfig'
68
- ]
69
- }]
93
+ }
70
94
}
71
95
}]
72
-
73
- return {'resources' : resources , 'outputs' : outputs }
96
+ return {'resources' : resources }
0 commit comments