magellan-cli 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b50c83378c4c2e7c8992abde1d7c6b6eb2b712c2
4
- data.tar.gz: 3e193a9ab5f4f00afa3571ba160219574cb3d3bb
3
+ metadata.gz: 5c33e40274842ea373e0c3cbbcdbdc4afd66c8c6
4
+ data.tar.gz: 4960b996af7200302e22ded5a71d7c4fb28832f8
5
5
  SHA512:
6
- metadata.gz: 140f87071bb2401945d826685ac7892a8da9c6ae8a1af162cea849e5e12e009d01b108d96dea472af50fe84bf556417c8cd6986fdec968733d2406690ca7eb17
7
- data.tar.gz: 5cc732c2b875cc9d8425d6149824ff122cb3fff887009842b2c5940e29f51931fa69505303dddb3412ef6e2b28010086e4f1035e39ea5d86769b8bec870d2ce0
6
+ metadata.gz: caa4369a0ce38eee04acea442b4d543f10f660519598c4da4a45fc6bdccf5befded5d34c5462935060fde7ab8a94424f147dd6febd063b97cc89acf7cd550c75
7
+ data.tar.gz: fbff5926ef59ee089720da957de03989ca5f4415bddd27748c58e1b740c49a66e0d5d2ff3f3bdb529c0303344a66c735f1d70e7829749a9ac7c2aeffb710b186
data/Gemfile.lock CHANGED
@@ -1,16 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- magellan-cli (0.2.0)
4
+ magellan-cli (0.2.1)
5
5
  activesupport (~> 4.1.4)
6
6
  httpclient
7
7
  nokogiri
8
+ text-table (~> 1.2.3)
8
9
  thor
9
10
 
10
11
  GEM
11
12
  remote: https://rubygems.org/
12
13
  specs:
13
- activesupport (4.1.6)
14
+ activesupport (4.1.8)
14
15
  i18n (~> 0.6, >= 0.6.9)
15
16
  json (~> 1.7, >= 1.7.7)
16
17
  minitest (~> 5.1)
@@ -18,14 +19,14 @@ GEM
18
19
  tzinfo (~> 1.1)
19
20
  coderay (1.1.0)
20
21
  diff-lcs (1.2.5)
21
- httpclient (2.4.0)
22
+ httpclient (2.5.3.3)
22
23
  i18n (0.6.11)
23
24
  json (1.8.1)
24
25
  method_source (0.8.2)
25
- mini_portile (0.6.0)
26
- minitest (5.4.2)
27
- nokogiri (1.6.3.1)
28
- mini_portile (= 0.6.0)
26
+ mini_portile (0.6.1)
27
+ minitest (5.4.3)
28
+ nokogiri (1.6.5)
29
+ mini_portile (~> 0.6.0)
29
30
  pry (0.9.12.6)
30
31
  coderay (~> 1.0)
31
32
  method_source (~> 0.8)
@@ -44,6 +45,7 @@ GEM
44
45
  rspec-support (~> 3.0.0)
45
46
  rspec-support (3.0.4)
46
47
  slop (3.5.0)
48
+ text-table (1.2.3)
47
49
  thor (0.19.1)
48
50
  thread_safe (0.3.4)
49
51
  tzinfo (1.2.2)
data/README.md CHANGED
@@ -62,7 +62,7 @@ Modify Host Instance config, if you need.
62
62
  magellan-cli host_instance show 1
63
63
  ```
64
64
 
65
- #### 7. [cli terminal] start stage inculding HostInstances and ContainerInstances
65
+ #### 7. [cli terminal] start stage inculding VmInstances and ContainerInstances
66
66
 
67
67
  ```
68
68
  magellan-cli stage start 1
@@ -16,9 +16,10 @@ module Magellan
16
16
  "client_version" => "ClientVersion",
17
17
  "tr" => "TransactionRouter",
18
18
  "worker" => "WorkerVersion",
19
- "instance" => "HostInstance",
19
+ "instance" => "VmInstance",
20
20
  "image" => "ContainerImage",
21
21
  "container" => "ContainerInstance",
22
+ "assignment" => "ContainerAssignment",
22
23
  }.each do |name, classname|
23
24
  desc "#{name} SUBCOMMAND ...ARGS", "manage #{name}"
24
25
  subcommand name, ::Magellan::Cli::Resources.const_get(classname)
@@ -35,6 +36,7 @@ module Magellan
35
36
  password = STDIN.noecho(&:gets).chomp
36
37
  puts ""
37
38
  update_selections("login" => {"email" => email, "password" => password})
39
+ Magellan::Cli::Http.new.login
38
40
  end
39
41
  end
40
42
  end
@@ -10,9 +10,7 @@ module Magellan
10
10
  def login
11
11
  cli = Cli::Login.new
12
12
  cli.login!
13
- r = yield(cli)
14
- success("OK")
15
- return r
13
+ return block_given? ? yield(cli) : success("OK")
16
14
  end
17
15
 
18
16
  # ログインしてGETします
@@ -26,8 +24,14 @@ module Magellan
26
24
  url << '?' << params.map{|k,v| "%s=%s" % [CGI.escape(k.to_s), CGI.escape(v.to_s)] }.join("&")
27
25
  end
28
26
  verbose("url: #{url}")
29
- res = cli.httpclient.get(url)
30
- JSON.parse(res.body)
27
+ # "Unknown key: max-age = 0" というメッセージを表示させないために$stderrを一時的に上書き
28
+ $stderr, bak = StringIO.new, $stderr
29
+ begin
30
+ res = cli.httpclient.get(url)
31
+ return JSON.parse(res.body)
32
+ ensure
33
+ $stderr = bak
34
+ end
31
35
  end
32
36
  end
33
37
 
@@ -86,13 +90,15 @@ module Magellan
86
90
  end
87
91
 
88
92
  def process_res(cli, http_method, rel_path, *args)
89
- res = cli.httpclient.send(http_method, "#{cli.base_url}#{rel_path}", *args)
93
+ url = "#{cli.base_url}#{rel_path}"
94
+ verbose("%s %s\n%s" % [http_method, url, args])
95
+ res = cli.httpclient.send(http_method, url, *args)
90
96
  case res.status
91
97
  when 200...300 then
92
98
  r = JSON.parse(res.body)
93
- $stdout.puts(JSON.pretty_generate(r))
99
+ verbose(JSON.pretty_generate(r))
94
100
  else
95
- $stdout.puts("\e[31m[#{res.status}]\e[0m\ #{res.body}")
101
+ info("\e[31m[#{res.status}]\e[0m\ #{res.body}")
96
102
  end
97
103
  end
98
104
 
@@ -8,6 +8,8 @@ require 'active_support/core_ext/string/inflections'
8
8
  require 'active_support/core_ext/class/attribute_accessors'
9
9
  require 'active_support/core_ext/object/blank'
10
10
 
11
+ require 'text-table'
12
+
11
13
  module Magellan
12
14
  module Cli
13
15
  module Resources
@@ -55,14 +57,91 @@ module Magellan
55
57
  return r
56
58
  end
57
59
 
60
+ def association_map(fields)
61
+ associations = {}
62
+ (self.class.field_associations || {}).each do |f, obj|
63
+ i = fields.index(f)
64
+ next unless i
65
+ fields[i] = obj[:name]
66
+ res = obj[:resource] || ((k = Resources.const_get(obj[:class])) ? k.resource_name : nil)
67
+ res2 = get_json("/admin/#{res}.json?compact=true")
68
+ associations[f] = res2.each_with_object({}){|r,d| d[ r["id"].to_i ] = r["label"] }
69
+ end
70
+ return associations
71
+ end
72
+
73
+ def association_get(associations, r, f)
74
+ v = r[f]
75
+ m = associations[f]
76
+ m ? m[v] || "(not found: #{v.inspect})" : v
77
+ end
78
+
79
+ DEFAULT_HIDDEN_FIELDS = %w[created_at updated_at].map(&:freeze).freeze
80
+
81
+
82
+ def query_list
83
+ get_json("/admin/#{self.class.resource_name}.json", default_query)
84
+ end
85
+ private :query_list
86
+
58
87
  def list
59
- r = get_json("/admin/#{self.class.resource_name}.json", default_query)
60
- $stdout.puts(JSON.pretty_generate(r) << "\nTotal: #{r.length}")
88
+ res1 = query_list
89
+ return $stdout.puts("Total: 0") if res1.empty?
90
+
91
+ t = Text::Table.new
92
+ original_fields =
93
+ res1.map(&:keys).flatten.uniq -
94
+ (self.class.hidden_fields || DEFAULT_HIDDEN_FIELDS) -
95
+ (self.class.multiline_fields || [])
96
+
97
+ fields = original_fields.dup
98
+ associations = association_map(fields)
99
+
100
+ t.head = fields
101
+ t.rows = []
102
+ res1.each do |r|
103
+ row = original_fields.map do |f|
104
+ association_get(associations, r, f)
105
+ end
106
+ t.rows << row
107
+ end
108
+ # $stdout.puts(JSON.pretty_generate(res1) << "\nTotal: #{res1.length}")
109
+ $stdout.puts(t.to_s << "\nTotal: #{res1.length}")
61
110
  end
62
111
 
63
112
  def show(id)
64
113
  r = get_json("/admin/#{self.class.resource_name}/#{id}.json")
65
- $stdout.puts(JSON.pretty_generate(r))
114
+ t = Text::Table.new
115
+ t.head = ["field", "value"]
116
+
117
+ table_fields = r.keys - (self.class.multiline_fields || [])
118
+ associations = association_map(table_fields.dup)
119
+ table_fields.each do |f|
120
+ t.rows << [f, association_get(associations, r, f)]
121
+ end
122
+ $stdout.puts t.to_s
123
+
124
+ (self.class.multiline_fields || []).each do |f|
125
+ $stdout.puts "\n"
126
+ $stdout.puts " #{f} ".center(50, "=")
127
+ v = r[f]
128
+ next unless v
129
+
130
+ case f
131
+ when /_json\Z/ then
132
+ next if v.empty?
133
+ begin
134
+ o = JSON.parse(v)
135
+ $stdout.puts(JSON.pretty_generate(o))
136
+ rescue JSON::ParserError => e
137
+ $stdout.puts "\e[33m[WARN] #{e.message}\e[0m"
138
+ $stdout.puts v
139
+ end
140
+ # when /_yaml\Z/ then
141
+ else
142
+ $stdout.puts v
143
+ end
144
+ end
66
145
  end
67
146
 
68
147
  def select(name)
@@ -83,6 +162,9 @@ module Magellan
83
162
  no_commands do
84
163
  cattr_accessor :resource_name
85
164
  cattr_accessor :resource_dependency
165
+ cattr_accessor :field_associations
166
+ cattr_accessor :hidden_fields, :multiline_fields
167
+
86
168
  def self.parameter_name
87
169
  resource_name.gsub(/~/, "_")
88
170
  end
@@ -7,7 +7,12 @@ module Magellan
7
7
 
8
8
  class ClientVersion < Base
9
9
  self.resource_name = "client_version"
10
- self.resource_dependency = {"stage" => "stage"}
10
+ self.resource_dependency = {"project" => "project"}
11
+
12
+ self.hidden_fields = %w[project_id created_at updated_at].map(&:freeze).freeze
13
+ self.field_associations = {
14
+ "stage_title_id" => {name: "stage", class: "Stage"},
15
+ }
11
16
 
12
17
  desc "create VERSION", "create New Client Version"
13
18
  def create(version)
@@ -0,0 +1,43 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "magellan/cli/resources"
3
+
4
+ module Magellan
5
+ module Cli
6
+ module Resources
7
+
8
+ class ContainerAssignment < Base
9
+ self.resource_name = "container~assignment"
10
+ self.resource_dependency = {"stage" => "stage-version"}
11
+
12
+ self.field_associations = {
13
+ "stage_version_id" => {name: "stage", resource: "stage~version"},
14
+ "vm_instance_id" => {name: "instance", class: "VmInstance"},
15
+ "container_image_id" => {name: "image", class: "ContainerImage"},
16
+ }
17
+
18
+ desc "create AMOUNT", "create assignment"
19
+ def create(amount)
20
+ img = load_selection("container_image")
21
+ instance = load_selection("vm_instance")
22
+ stage_version = load_selection("stage-version")
23
+ params = {
24
+ "container_assignment" => {
25
+ "stage_version_id" => stage_version["id"],
26
+ "vm_instance_id" => instance["id"],
27
+ "container_image_id" => img["id"],
28
+ "amount" => amount.to_i,
29
+ }
30
+ }
31
+ post_json("/admin/#{self.resource_name}/new.js", params)
32
+ end
33
+
34
+ desc "delete ID", "delete assignment"
35
+ def delete(id)
36
+ super "/admin/#{self.resource_name}/#{id}/delete"
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -8,6 +8,8 @@ module Magellan
8
8
  class ContainerImage < Base
9
9
  self.resource_name = "container~image"
10
10
  self.resource_dependency = {"stage" => "stage-version"}
11
+ self.hidden_fields = %w[function_id function_type created_at updated_at].map(&:freeze).freeze
12
+ self.field_associations = {"stage_version_id" => {name: "stage", resource: "stage~version"} }
11
13
  end
12
14
 
13
15
  end
@@ -8,6 +8,14 @@ module Magellan
8
8
  class ContainerInstance < Base
9
9
  self.resource_name = "container~instance"
10
10
  self.resource_dependency = {"stage" => "stage-version"}
11
+ self.hidden_fields = %w[created_at updated_at].map(&:freeze).freeze
12
+ self.multiline_fields = %w[docker_properties_json links_yaml publishings_yaml volumes_yaml env_yaml].map(&:freeze).freeze
13
+ self.field_associations = {
14
+ "stage_version_id" => {name: "stage", resource: "stage~version"},
15
+ "vm_instance_id" => {name: "instance", class: "VmInstance"},
16
+ "container_image_id" => {name: "image", class: "ContainerImage"},
17
+ # "container_assignment_id" => {name: "assignment", class: "ContainerAssignment"},
18
+ }
11
19
  end
12
20
 
13
21
  end
@@ -7,6 +7,7 @@ module Magellan
7
7
 
8
8
  class Organization < Base
9
9
  self.resource_name = "magellan~auth~organization"
10
+ # self.field_associations = {"creator_id" => {name: "creator", class: "User"} }
10
11
 
11
12
  desc "create NAME", "create Organization with NAME"
12
13
  def create(name)
@@ -8,6 +8,8 @@ module Magellan
8
8
  class Project < Base
9
9
  self.resource_name = "project"
10
10
  self.resource_dependency = nil
11
+ self.hidden_fields = %w[default_nebula_id created_at updated_at].map(&:freeze).freeze
12
+ self.field_associations = {"organization_id" => {name: "organization", class: "Organization"} }
11
13
 
12
14
  desc "update ATTRIBUTES", "update project with ATTRIBUTES"
13
15
  def update(attrs)
@@ -9,6 +9,8 @@ module Magellan
9
9
  class Stage < Base
10
10
  self.resource_name = "stage~title"
11
11
  self.resource_dependency = {"project" => "project"}
12
+ self.hidden_fields = %w[nebula_id created_at updated_at].map(&:freeze).freeze
13
+ self.field_associations = {"project_id" => {name: "project", class: "Project"} }
12
14
 
13
15
  desc "create NAME [-t development|staging|production|other]", "create Stage with Name and Type"
14
16
  option :t, type: :string, default: "development", desc: "-t development|staging|production. specify Stage Type"
@@ -8,6 +8,7 @@ module Magellan
8
8
  class Team < Base
9
9
  self.resource_name = "magellan~auth~team"
10
10
  self.resource_dependency = { "organization" => Organization.parameter_name }
11
+ self.field_associations = {"organization_id" => {name: "organization", class: "Organization"} }
11
12
 
12
13
  desc "create NAME ROLE", "create Team with NAME ROLE"
13
14
  def create(name, role)
@@ -0,0 +1,55 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "magellan/cli/resources"
3
+
4
+ module Magellan
5
+ module Cli
6
+ module Resources
7
+
8
+ class VmInstance < Base
9
+ self.resource_name = "vm~instance"
10
+ self.resource_dependency = {"stage" => "stage"}
11
+
12
+ self.multiline_fields = %w[additional_disks_yaml].map(&:freeze).freeze
13
+
14
+ no_commands do
15
+ def query_list
16
+ stage_id = load_selection("stage")["id"] rescue nil
17
+ if stage_id
18
+ get_json("/admin/stage~title/#{stage_id}/instance_list.json", {})
19
+ else
20
+ get_json("/admin/vm~instance.json")
21
+ end
22
+ end
23
+ private :query_list
24
+ end
25
+
26
+ def select(name)
27
+ q = build_query("name" => name)
28
+ update_first_result(self.class.parameter_name, "/admin/#{self.class.resource_name}.json", q)
29
+ end
30
+
31
+ desc "sample_launch_options", "dump sample launch_options for create"
32
+ def sample_launch_options
33
+ $stdout.puts File.read(File.expand_path("../sample_launch_options.json", __FILE__))
34
+ end
35
+
36
+ desc "create NAME [LAUNCH_OPTIONS]", "create Instance"
37
+ def create(name, launch_options = nil)
38
+ stage_id = load_selection("stage-version")
39
+ launch_options = JSON.parse(File.readable?(launch_options) ? File.read(launch_options) : launch_options)
40
+
41
+ params = {
42
+ "host_instance" => {
43
+ "stage_id" => stage_id,
44
+ "name" => name,
45
+ "launch_options_yaml" => YAML.dump(launch_options),
46
+ }
47
+ }
48
+ post_json("/admin/vm~instance/new.js", params)
49
+ end
50
+
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -8,6 +8,9 @@ module Magellan
8
8
  class WorkerVersion < Base
9
9
  self.resource_name = "functions~worker"
10
10
  self.resource_dependency = {"stage" => "stage-version"}
11
+ self.hidden_fields = %w[created_at updated_at].map(&:freeze).freeze
12
+ self.multiline_fields = %w[migration_command_1 migration_command_2 run_command environment_vars_yaml].map(&:freeze).freeze
13
+ self.field_associations = {"stage_version_id" => {name: "stage", resource: "stage~version"} }
11
14
 
12
15
  desc "create NAME, IMAGE", "create WorkerVersion with NAME, IMAGE"
13
16
  method_option :attributes_yaml, aliases: "-A", desc: "path to YAML file which defines attributes"
@@ -19,10 +19,11 @@ module Magellan
19
19
  autoload :TransactionRouter, "magellan/cli/resources/transaction_router"
20
20
  autoload :WorkerVersion , "magellan/cli/resources/worker_version"
21
21
 
22
- autoload :HostInstance , "magellan/cli/resources/host_instance"
22
+ autoload :VmInstance , "magellan/cli/resources/vm_instance"
23
23
 
24
24
  autoload :ContainerImage , "magellan/cli/resources/container_image"
25
25
  autoload :ContainerInstance, "magellan/cli/resources/container_instance"
26
+ autoload :ContainerAssignment, "magellan/cli/resources/container_assignment"
26
27
 
27
28
  end
28
29
  end
@@ -1,5 +1,5 @@
1
1
  module Magellan
2
2
  module Cli
3
- VERSION = "0.2.0"
3
+ VERSION = "0.2.1"
4
4
  end
5
5
  end
data/magellan-cli.gemspec CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_runtime_dependency "thor"
23
23
  spec.add_runtime_dependency "nokogiri"
24
24
  spec.add_runtime_dependency "activesupport", "~> 4.1.4"
25
+ spec.add_runtime_dependency "text-table", "~> 1.2.3"
25
26
 
26
27
  spec.add_development_dependency "bundler", "~> 1.6"
27
28
  spec.add_development_dependency "rake", "~> 10.0"
@@ -7,7 +7,7 @@ describe Magellan::Cli::Resources::ClientVersion do
7
7
 
8
8
  describe :list do
9
9
  before do
10
- expect(cmd).to receive(:load_selections).and_return({"stage" => {"id" => "1", "name" => "StageA"} })
10
+ expect(cmd).to receive(:load_selections).and_return({"project" => {"id" => 1, "name" => "ProjectA"}})
11
11
  expect(cmd).to receive(:get_json).and_return([{id: 1, project_id: 1, stage_title_id: 1, version: "1.0.0", url_mapping_yaml: nil, status: "1" }])
12
12
  expect($stdout).to receive(:puts)
13
13
  end
@@ -19,7 +19,7 @@ describe Magellan::Cli::Resources::ClientVersion do
19
19
  describe :create do
20
20
  describe :success do
21
21
  before do
22
- expect(cmd).to receive(:load_selections).and_return({"stage" => {"id" => 1, "name" => "StageA"}})
22
+ expect(cmd).to receive(:load_selections).and_return({"project" => {"id" => 1, "name" => "ProjectA"}, "stage" => {"id" => 1, "name" => "StageA"} })
23
23
  expect(cmd).to receive(:post_json).with("/admin/client_version/new.js", { "client_version" => { "stage_title_id" => 1, "version" => "1.1.0" } })
24
24
  end
25
25
  it do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magellan-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - akm2000
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-10 00:00:00.000000000 Z
11
+ date: 2014-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 4.1.4
69
+ - !ruby/object:Gem::Dependency
70
+ name: text-table
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.2.3
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.2.3
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: bundler
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -137,14 +151,15 @@ files:
137
151
  - lib/magellan/cli/resources.rb
138
152
  - lib/magellan/cli/resources/base.rb
139
153
  - lib/magellan/cli/resources/client_version.rb
154
+ - lib/magellan/cli/resources/container_assignment.rb
140
155
  - lib/magellan/cli/resources/container_image.rb
141
156
  - lib/magellan/cli/resources/container_instance.rb
142
- - lib/magellan/cli/resources/host_instance.rb
143
157
  - lib/magellan/cli/resources/organization.rb
144
158
  - lib/magellan/cli/resources/project.rb
145
159
  - lib/magellan/cli/resources/stage.rb
146
160
  - lib/magellan/cli/resources/team.rb
147
161
  - lib/magellan/cli/resources/transaction_router.rb
162
+ - lib/magellan/cli/resources/vm_instance.rb
148
163
  - lib/magellan/cli/resources/worker_version.rb
149
164
  - lib/magellan/cli/sample_launch_options.json
150
165
  - lib/magellan/cli/ssl.rb
@@ -1,43 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- require "magellan/cli/resources"
3
-
4
- module Magellan
5
- module Cli
6
- module Resources
7
-
8
- class HostInstance < Base
9
- self.resource_name = "vm~instance"
10
- self.resource_dependency = {"stage" => "stage"}
11
-
12
- desc "list", "list instances"
13
- def list
14
- stage_id = load_selection("stage")["id"] rescue nil
15
- r = ""
16
- if stage_id
17
- r = get_json("/admin/stage~title/#{stage_id}/instance_list.json", {})
18
- else
19
- r = get_json("/admin/vm~instance.json")
20
- end
21
- $stdout.puts(JSON.pretty_generate(r) << "\nTotal: #{r.length}")
22
- end
23
-
24
- desc "create NAME [LAUNCH_OPTIONS]", "create Host Instance"
25
- def create(name, launch_options = nil)
26
- stage_id = load_selection("stage-version")
27
- launch_options = JSON.parse(File.readable?(launch_options) ? File.read(launch_options) : launch_options)
28
-
29
- params = {
30
- "host_instance" => {
31
- "stage_id" => stage_id,
32
- "name" => name,
33
- "launch_options_yaml" => YAML.dump(launch_options),
34
- }
35
- }
36
- post_json("/admin/vm~instance/new.js", params)
37
- end
38
-
39
- end
40
-
41
- end
42
- end
43
- end