diff --git a/lib/docker.rb b/lib/docker.rb index 396d7f327..3eb6a4ccb 100644 --- a/lib/docker.rb +++ b/lib/docker.rb @@ -31,6 +31,9 @@ module Docker require 'docker/image' require 'docker/messages_stack' require 'docker/messages' + require 'docker/node' + require 'docker/service' + require 'docker/swarm' require 'docker/util' require 'docker/version' require 'docker/volume' diff --git a/lib/docker/node.rb b/lib/docker/node.rb new file mode 100644 index 000000000..2841a9e31 --- /dev/null +++ b/lib/docker/node.rb @@ -0,0 +1,30 @@ +# This class represents a Docker Node. It's important to note that nothing +# is cached so that the information is always up to date. +class Docker::Node + include Docker::Base + + def self.all(opts = {}, conn = Docker.connection) + hashes = Docker::Util.parse_json(conn.get('/nodes', opts)) || [] + hashes.map { |hash| new(conn, hash) } + end + + def self.get(id, conn = Docker.connection) + node_json = conn.get("/nodes/#{URI.encode(id)}") + new(conn, Docker::Util.parse_json(node_json) || {}) + end + + def remove(opts = {}) + connection.delete("/nodes/#{self.id}", opts) + nil + end + + def update(opts) + filter = opts.delete('filter') || opts.delete(:filter) + query = {} + query['filter'] = filter if filter + + connection.post("/services/#{self.id}", query, body: opts.to_json) + end + + private_class_method :new +end diff --git a/lib/docker/service.rb b/lib/docker/service.rb new file mode 100644 index 000000000..2070f282f --- /dev/null +++ b/lib/docker/service.rb @@ -0,0 +1,40 @@ +# This class represents a Docker Service. It's important to note that nothing +# is cached so that the information is always up to date. +class Docker::Service + include Docker::Base + + def self.all(opts = {}, conn = Docker.connection) + hashes = Docker::Util.parse_json(conn.get('/services', opts)) || [] + hashes.map { |hash| new(conn, hash) } + end + + def self.get(id, opts = {}, conn = Docker.connection) + service_json = conn.get("/services/#{URI.encode(id)}", opts) + new(conn, Docker::Util.parse_json(service_json) || {}) + end + + def self.create(opts = {}, conn = Docker.connection) + name = opts.delete('name') || opts.delete(:name) + query = {} + query['name'] = name if name + + response = conn.post('/services/create', query, :body => opts.to_json) + hash = Docker::Util.parse_json(response) || {} + new(conn, hash) + end + + def remove(opts = {}) + connection.delete("/services/#{self.id}", opts) + nil + end + + def update(opts) + connection.post("/services/#{self.id}/update", {}, body: opts.to_json) + end + + def logs(opts = {}) + connection.get("/services/#{self.id}/logs", opts) + end + + private_class_method :new +end diff --git a/lib/docker/swarm.rb b/lib/docker/swarm.rb new file mode 100644 index 000000000..fd3388864 --- /dev/null +++ b/lib/docker/swarm.rb @@ -0,0 +1,11 @@ +# This class represents a Docker Swarm instance. It's important to note that nothing +# is cached so that the information is always up to date. +class Docker::Swarm + include Docker::Base + + def self.inspect(conn = Docker.connection) + new(conn, Docker::Util.parse_json(conn.get('/swarm'))) + end + + private_class_method :new +end