Skip to content

Commit 869748b

Browse files
authored
Merge pull request #509 from khaefeli/tasks
Add new Docker Swarm Tasks (node ls, rm, update; service scale)
2 parents 03f5178 + bf8dc5c commit 869748b

File tree

8 files changed

+188
-0
lines changed

8 files changed

+188
-0
lines changed

tasks/node_ls.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
{
3+
"description": "List nodes in the swarm",
4+
"input_method": "stdin",
5+
"parameters": {
6+
"filter": {
7+
"description": "Filter output based on conditions provided",
8+
"type": "Optional[String[1]]"
9+
},
10+
"quiet": {
11+
"description": "Only display IDs",
12+
"type": "Optional[Boolean]"
13+
}
14+
}
15+
}

tasks/node_ls.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/opt/puppetlabs/puppet/bin/ruby
2+
# frozen_string_literal: true
3+
4+
require 'json'
5+
require 'open3'
6+
require 'puppet'
7+
8+
def node_ls(filter, quiet)
9+
cmd_string = 'docker node ls'
10+
cmd_string += " --filter=#{filter}" unless filter.nil?
11+
cmd_string += ' --quiet' unless quiet.nil?
12+
13+
stdout, stderr, status = Open3.capture3(cmd_string)
14+
raise Puppet::Error, "stderr: '#{stderr}'" if status != 0
15+
stdout.strip
16+
end
17+
18+
params = JSON.parse(STDIN.read)
19+
filter = params['filter']
20+
quiet = params['quiet']
21+
22+
begin
23+
result = node_ls(filter, quiet)
24+
puts result
25+
exit 0
26+
rescue Puppet::Error => e
27+
puts(status: 'failure', error: e.message)
28+
exit 1
29+
end

tasks/node_rm.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
{
3+
"description": "Update a node",
4+
"input_method": "stdin",
5+
"parameters": {
6+
"force": {
7+
"description": "Force remove a node from the swarm",
8+
"type": "Optional[Boolean]"
9+
},
10+
"node": {
11+
"description": "Hostname or ID of the node in the swarm",
12+
"type": "String[1]"
13+
}
14+
}
15+
}

tasks/node_rm.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/opt/puppetlabs/puppet/bin/ruby
2+
# frozen_string_literal: true
3+
4+
require 'json'
5+
require 'open3'
6+
require 'puppet'
7+
8+
def node_rm(force, node)
9+
cmd_string = 'docker node rm'
10+
cmd_string += ' --force' unless force.nil?
11+
cmd_string += " #{node}" unless node.nil?
12+
13+
stdout, stderr, status = Open3.capture3(cmd_string)
14+
raise Puppet::Error, "stderr: '#{stderr}'" if status != 0
15+
stdout.strip
16+
end
17+
18+
params = JSON.parse(STDIN.read)
19+
force = params['force']
20+
node = params['node']
21+
22+
begin
23+
result = node_rm(force, node)
24+
puts result
25+
exit 0
26+
rescue Puppet::Error => e
27+
puts(status: 'failure', error: e.message)
28+
exit 1
29+
end

tasks/node_update.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
{
3+
"description": "Update a node",
4+
"input_method": "stdin",
5+
"parameters": {
6+
"availability": {
7+
"description": "Availability of the node",
8+
"type": "Optional[Enum['active', 'pause', 'drain']]"
9+
},
10+
"role": {
11+
"description": "Role of the node",
12+
"type": "Optional[Enum['manager', 'worker']]"
13+
},
14+
"node": {
15+
"description": "Hostname or ID of the node in the swarm",
16+
"type": "String[1]"
17+
}
18+
}
19+
}

tasks/node_update.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/opt/puppetlabs/puppet/bin/ruby
2+
# frozen_string_literal: true
3+
4+
require 'json'
5+
require 'open3'
6+
require 'puppet'
7+
8+
def node_update(availability, role, node)
9+
cmd_string = 'docker node update'
10+
cmd_string += " --availability #{availability}" unless availability.nil?
11+
cmd_string += " --role #{role}" unless role.nil?
12+
cmd_string += " #{node}" unless node.nil?
13+
14+
stdout, stderr, status = Open3.capture3(cmd_string)
15+
raise Puppet::Error, "stderr: '#{stderr}'" if status != 0
16+
stdout.strip
17+
end
18+
19+
params = JSON.parse(STDIN.read)
20+
availability = params['availability']
21+
role = params['role']
22+
node = params['node']
23+
24+
begin
25+
result = node_update(availability, role, node)
26+
puts result
27+
exit 0
28+
rescue Puppet::Error => e
29+
puts(status: 'failure', error: e.message)
30+
exit 1
31+
end

tasks/service_scale.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
{
3+
"description": "Scale one replicated service",
4+
"input_method": "stdin",
5+
"parameters": {
6+
"service": {
7+
"description": "Name or ID of the service",
8+
"type": "String[1]"
9+
},
10+
"scale": {
11+
"description": "Number of replicas",
12+
"type": "Integer"
13+
},
14+
"detatch": {
15+
"description": "Exit immediately instead of waiting for the service to converge",
16+
"type": "Optional[Boolean]"
17+
}
18+
}
19+
}

tasks/service_scale.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/opt/puppetlabs/puppet/bin/ruby
2+
# frozen_string_literal: true
3+
4+
require 'json'
5+
require 'open3'
6+
require 'puppet'
7+
8+
def service_scale(service, scale, detach)
9+
cmd_string = 'docker service scale'
10+
cmd_string += " #{service}" unless service.nil?
11+
cmd_string += "=#{scale}" unless scale.nil?
12+
cmd_string += ' -d' unless detach.nil?
13+
14+
stdout, stderr, status = Open3.capture3(cmd_string)
15+
raise Puppet::Error, "stderr: '#{stderr}'" if status != 0
16+
stdout.strip
17+
end
18+
19+
params = JSON.parse(STDIN.read)
20+
service = params['service']
21+
scale = params['scale']
22+
detach = params['detach']
23+
24+
begin
25+
result = service_scale(service, scale, detach)
26+
puts result
27+
exit 0
28+
rescue Puppet::Error => e
29+
puts(status: 'failure', error: e.message)
30+
exit 1
31+
end

0 commit comments

Comments
 (0)