magellan-cli 0.2.19 → 0.3.0

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: 727be865a8fa69b098afe51d712bad1a31a45724
4
- data.tar.gz: 506f81d124f8eb15b767f11f69feaf19d1684257
3
+ metadata.gz: 1f56a7867635b8b04efd6c8963f2e361d5595b4c
4
+ data.tar.gz: bdcd4c0d35743f63d06893c86f19ae444cfc23c2
5
5
  SHA512:
6
- metadata.gz: dbecdde19ac927dcc2259a967a944e697aca441a12ec3f518d25a9a31d133663ed90e8a94daf719407f059d7933a1baa07248e8e0fe961640a8feb71eae47ab4
7
- data.tar.gz: 935c8e96e86ec2cf3caf5742b40495bf941ebc3761c2464b72e93517d2709dc2a3fa4675bf27b8e02ef0d31bd34a1dce9e6362f9337c657d55400f7dbe72257c
6
+ metadata.gz: 13e9af5a5addcd0a6b6e1f9112de1547c03ca2a6593ad49e417a6707309b2162552c0ed8fad4e1d0791095b27d091f476615fa9d5b52f82375c69b290158c2d1
7
+ data.tar.gz: f8e9cadeafb898f308e78cb5f8e5bfe1f6385474c3b2f23e87f491c31e1979285ad880da76a7d28592e2a108813f22d9f1765a0964c0730f3ce34132b05ac7bd
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- magellan-cli (0.2.19)
4
+ magellan-cli (0.3.0)
5
5
  activesupport (~> 4.1.4)
6
6
  groovenauts-thor
7
7
  httpclient (~> 2.5)
@@ -29,22 +29,22 @@ module Magellan
29
29
  opts[:verbose]
30
30
  end
31
31
 
32
- def verbose(msg)
33
- self.class.verbose(msg) if verbose?
32
+ def log_verbose(msg)
33
+ self.class.log_verbose(msg) if verbose?
34
34
  end
35
35
 
36
- def info(msg)
37
- self.class.info(msg)
36
+ def log_info(msg)
37
+ self.class.log_info(msg)
38
38
  end
39
- def success(msg)
40
- self.class.success(msg)
39
+ def log_success(msg)
40
+ self.class.log_success(msg)
41
41
  end
42
- def error(msg)
43
- self.class.error(msg)
42
+ def log_error(msg)
43
+ self.class.log_error(msg)
44
44
  end
45
45
 
46
46
  def fatal(msg)
47
- verbose(caller.join("\n "))
47
+ log_verbose(caller.join("\n "))
48
48
  raise Cli::Error, msg
49
49
  end
50
50
  end
@@ -54,16 +54,16 @@ module Magellan
54
54
  $stderr.puts("\e[#{color_no}m#{msg}\e[0m")
55
55
  end
56
56
 
57
- def verbose(msg, flag = true)
57
+ def log_verbose(msg, flag = true)
58
58
  puts_with_color(34, msg) if flag
59
59
  end
60
- def info(msg)
60
+ def log_info(msg)
61
61
  puts_with_color(0, msg)
62
62
  end
63
- def success(msg)
63
+ def log_success(msg)
64
64
  puts_with_color(32, msg)
65
65
  end
66
- def error(msg)
66
+ def log_error(msg)
67
67
  puts_with_color(31, msg)
68
68
  end
69
69
 
@@ -6,22 +6,26 @@ require 'active_support/core_ext/string/inflections'
6
6
  module Magellan
7
7
  module Cli
8
8
  class Command < Base
9
+ include Magellan::Cli::FileAccess
9
10
 
10
11
  class << self
11
12
  # override Thor::Base.start method
12
13
  def start(given_args = ARGV, config = {})
13
14
  # class_options verbose and version are defined in Magellan::Cli::Base
14
- if ARGV.include?("-v") || ARGV.include?("--version")
15
- info(File.basename($0) << " " << Magellan::Cli::VERSION)
15
+ if (ARGV == ["-v"] || ARGV == ["--version"])
16
+ log_info(File.basename($0) << " " << Magellan::Cli::VERSION)
17
+ exit(0)
18
+ elsif ARGV.include?("-v") || ARGV.include?("--version")
19
+ log_info(File.basename($0) << " " << Magellan::Cli::VERSION)
16
20
  end
17
21
  begin
18
22
  super(given_args, config)
19
23
  rescue Magellan::Cli::Error => e
20
- error(e.message)
24
+ log_error(e.message)
21
25
  exit(1)
22
26
  rescue => e
23
- error("[#{e.class}] #{e.message}")
24
- verbose(" " << e.backtrace.join("\n "), ARGV.include?("-V") || ARGV.include?("--verbose"))
27
+ log_error("[#{e.class}] #{e.message}")
28
+ log_verbose(" " << e.backtrace.join("\n "), ARGV.include?("-V") || ARGV.include?("--verbose"))
25
29
  exit(1)
26
30
  end
27
31
  end
@@ -66,6 +70,21 @@ module Magellan
66
70
  Magellan::Cli::Http.new.login!(email, password)
67
71
  end
68
72
 
73
+ desc "info", "Show login user and selected resources"
74
+ def info
75
+ cli = Magellan::Cli::Login.new
76
+ cli.check_login_auth!
77
+ selections = load_selections || {}
78
+ d = {"user" => cli.login_auth["email"] }
79
+ Resources::MAPPING.each do |classname, name|
80
+ klass = ::Magellan::Cli::Resources.const_get(classname)
81
+ if val = selections[ klass.parameter_name ]
82
+ d[name] = val["name"] ? val["name"] : val.inspect
83
+ end
84
+ end
85
+ log_info YAML.dump(d)
86
+ end
87
+
69
88
  end
70
89
  end
71
90
  end
@@ -19,10 +19,17 @@ module Magellan
19
19
  File.readable?(SELECTION_FILENAME) ? YAML.load_file(SELECTION_FILENAME) : {}
20
20
  end
21
21
 
22
- def load_selection(name)
22
+ # @param [Class|String] obj Resource class or resource name
23
+ def load_selection(obj)
24
+ if obj.respond_to?(:parameter_name)
25
+ name = obj.parameter_name
26
+ label = obj.name.split(/::/).last.underscore
27
+ else
28
+ name = label = obj
29
+ end
23
30
  sel = load_selections
24
31
  s = sel[name]
25
- raise NotSelected, "No #{name} selected" unless s
32
+ raise NotSelected, "No #{label} selected" unless s
26
33
  return s
27
34
  end
28
35
 
@@ -14,21 +14,18 @@ module Magellan
14
14
  def login!(email, password)
15
15
  logined = cli.api_login!(email, password)
16
16
  if logined
17
- success("OK")
17
+ log_success("OK")
18
18
  else
19
- error("Login Failure.")
19
+ log_error("Login Failure.")
20
20
  end
21
21
  end
22
22
 
23
23
  def access_api
24
24
  if block_given?
25
- auth = cli.login_auth
26
- if auth.nil? || auth.empty?
27
- raise Magellan::Cli::Error, "Not logined yet. type `#{File.basename($0)} login`."
28
- end
25
+ cli.check_login_auth!
29
26
  return yield(cli)
30
27
  else
31
- return success("OK")
28
+ return log_success("OK")
32
29
  end
33
30
  end
34
31
 
@@ -36,7 +33,7 @@ module Magellan
36
33
  case res.status
37
34
  when 200...300 then
38
35
  r = JSON.parse(res.body)
39
- verbose(JSON.pretty_generate(r))
36
+ log_verbose(JSON.pretty_generate(r))
40
37
  r
41
38
  else
42
39
  obj = JSON.parse(res.body) rescue nil
@@ -45,7 +42,7 @@ module Magellan
45
42
  else
46
43
  msg = "HTTP Error: status=#{res.status}"
47
44
  msg << "\n#{res.body}" if verbose?
48
- error(msg)
45
+ log_error(msg)
49
46
  end
50
47
  end
51
48
  end
@@ -62,7 +59,7 @@ module Magellan
62
59
  if params && !params.empty?
63
60
  url << '?' << params.map{|k,v| "%s=%s" % [CGI.escape(k.to_s), CGI.escape(v.to_s)] }.join("&")
64
61
  end
65
- verbose("GET #{url}")
62
+ log_verbose("GET #{url}")
66
63
  # "Unknown key: max-age = 0" というメッセージを表示させないために$stderrを一時的に上書き
67
64
  $stderr, bak = StringIO.new, $stderr
68
65
  res = nil
@@ -125,13 +122,13 @@ module Magellan
125
122
  def delete(rel_path)
126
123
  access_api do |api|
127
124
  params = api.login_auth
128
- process_res(api, :delete, rel_path, params)
125
+ process_res(api, :delete, rel_path, params.to_json, JSON_HEADER)
129
126
  end
130
127
  end
131
128
 
132
129
  def process_res(api, http_method, rel_path, *args)
133
130
  url = "#{api.base_url}#{rel_path}"
134
- verbose("%s %s\n%s" % [http_method.to_s.upcase, url, args])
131
+ log_verbose("%s %s\n%s" % [http_method.to_s.upcase, url, args])
135
132
  res = api.httpclient.send(http_method, url, *args)
136
133
  check_response(res)
137
134
  end
@@ -56,6 +56,13 @@ module Magellan
56
56
  @login_url ||= base_url + "/api/sign_in.json"
57
57
  end
58
58
 
59
+ def check_login_auth!
60
+ auth = login_auth
61
+ if auth.nil? || auth.empty?
62
+ raise Magellan::Cli::Error, "Not logined yet. type `#{File.basename($0)} login`."
63
+ end
64
+ end
65
+
59
66
  # magellan-apiサーバに接続してログインの検証とアクセストークンの保存を行います。
60
67
  #
61
68
  # @return [boolean] login成功/失敗
@@ -53,12 +53,16 @@ module Magellan
53
53
  end
54
54
  end
55
55
 
56
+ def get_first_result!(name, path, query)
57
+ results = get_json(path, query)
58
+ raise NotFound, "#{name} not found for #{query.inspect}" if results.blank? || results.first.blank?
59
+ results.first
60
+ end
61
+
56
62
  DEFAULT_SELECTION_FIELDS = %w[id name].freeze
57
63
 
58
64
  def update_first_result(name, path, query, fields = DEFAULT_SELECTION_FIELDS)
59
- results = get_json(path, query)
60
- raise NotFound, "#{name} not found for #{query.inspect}" if results.blank? || results.first.blank?
61
- r = results.first
65
+ r = get_first_result!(name, path, query)
62
66
  obj = fields.each_with_object({}) do |f, d|
63
67
  d[f] = r[f]
64
68
  end
@@ -108,14 +112,17 @@ module Magellan
108
112
  (self.class.multiline_fields || [])
109
113
 
110
114
  fields = original_fields.dup
115
+ fields.unshift(" ")
111
116
  associations = association_map(fields)
112
117
 
113
118
  t.head = fields
114
119
  t.rows = []
120
+ selected_id = (load_selections[ parameter_name ] || {})["id"]
115
121
  res1.each do |r|
116
122
  row = original_fields.map do |f|
117
123
  association_get(associations, r, f)
118
124
  end
125
+ row.unshift(r["id"] == selected_id ? "*" : " ")
119
126
  t.rows << row
120
127
  end
121
128
  # $stdout.puts(JSON.pretty_generate(res1) << "\nTotal: #{res1.length}")
@@ -166,6 +173,16 @@ module Magellan
166
173
  update_selections! do |s|
167
174
  s.delete(self.class.parameter_name)
168
175
  end
176
+ deselect_dependants
177
+ end
178
+
179
+ def deselect_dependants
180
+ update_selections! do |s|
181
+ classes = Resources.dependants_on(self.class)
182
+ classes.each do |klass|
183
+ s.delete(klass.parameter_name)
184
+ end
185
+ end
169
186
  end
170
187
 
171
188
  def self.inherited(klass)
@@ -16,7 +16,7 @@ module Magellan
16
16
 
17
17
  desc "create VERSION", "Create a new #{resource_name}"
18
18
  def create(version)
19
- stage = load_selection!("stage")
19
+ stage = load_selection!(Stage)
20
20
  params = {
21
21
  parameter_name => {
22
22
  "stage_title_id" => stage["id"],
@@ -27,6 +27,15 @@ module Magellan
27
27
  # TODO implement select method
28
28
  # select(version)
29
29
  end
30
+
31
+ desc "delete VERSION", "Delete the #{resource_name} specified by VERSION"
32
+ def delete(version)
33
+ q = build_query("version" => version).update(default_query)
34
+ r = get_first_result!(self.class.resource_name, "/admin/#{resource_key}.json", q)
35
+ super("/admin/#{resource_key}/#{r['id']}/delete")
36
+ log_success("OK")
37
+ end
38
+
30
39
  end
31
40
 
32
41
  end
@@ -7,12 +7,12 @@ module Magellan
7
7
 
8
8
  class Cloudsql < Base
9
9
  self.resource_key = "cloudsql~database"
10
- self.resource_dependency = {"stage" => "stage"}
10
+ self.resource_dependency = {"stage" => Stage.parameter_name}
11
11
  self.hidden_fields = %w[cloudsql_instance_id].map(&:freeze).freeze
12
12
 
13
13
  desc "create NAME", "Create a new #{resource_name} database with NAME"
14
14
  def create(name)
15
- o = load_selection!("stage")
15
+ o = load_selection!(Stage)
16
16
  params = {
17
17
  parameter_name => {
18
18
  "stage_title_id" => o["id"],
@@ -7,7 +7,7 @@ module Magellan
7
7
 
8
8
  class Container < Base
9
9
  self.resource_key = "container~instance"
10
- self.resource_dependency = {"stage" => "stage-version"}
10
+ self.resource_dependency = {"stage" => Stage::VERSION_PARAMETER_NAME}
11
11
  self.hidden_fields = %w[created_at updated_at].map(&:freeze).freeze
12
12
  self.multiline_fields = %w[docker_properties_json links_yaml publishings_yaml volumes_yaml env_yaml].map(&:freeze).freeze
13
13
  self.field_associations = {
@@ -0,0 +1,28 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "magellan/cli/resources"
3
+
4
+ module Magellan
5
+ module Cli
6
+ module Resources
7
+
8
+ module Deletable
9
+
10
+ def self.included(klass)
11
+ klass.module_eval do
12
+
13
+ desc "delete NAME", "Delete the #{resource_name} named by NAME"
14
+ def delete(name)
15
+ q = build_query("name" => name).update(default_query)
16
+ r = get_first_result!(self.class.resource_name, "/admin/#{resource_key}.json", q)
17
+ super("/admin/#{resource_key}/#{r['id']}/delete")
18
+ log_success("OK")
19
+ end
20
+
21
+ end
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -7,7 +7,7 @@ module Magellan
7
7
 
8
8
  class Image < Base
9
9
  self.resource_key = "container~image"
10
- self.resource_dependency = {"stage" => "stage-version"}
10
+ self.resource_dependency = {"stage" => Stage::VERSION_PARAMETER_NAME}
11
11
  self.hidden_fields = %w[function_id function_type created_at updated_at].map(&:freeze).freeze
12
12
  self.field_associations = {"stage_version_id" => {name: "stage", resource: "stage~version"} }
13
13
  end
@@ -6,6 +6,7 @@ module Magellan
6
6
  module Resources
7
7
 
8
8
  class Organization < Base
9
+ include Deletable
9
10
 
10
11
  self.resource_key = "magellan~auth~organization"
11
12
  # self.field_associations = {"creator_id" => {name: "creator", class: "User"} }
@@ -6,6 +6,8 @@ module Magellan
6
6
  module Resources
7
7
 
8
8
  class Project < Base
9
+ include Deletable
10
+
9
11
  self.resource_key = "project"
10
12
  self.resource_dependency = nil
11
13
  self.hidden_fields = %w[default_nebula_id created_at updated_at].map(&:freeze).freeze
@@ -13,14 +15,14 @@ module Magellan
13
15
 
14
16
  desc "update ATTRIBUTES", "Update the ATTRIBUTES of the selected #{resource_name}"
15
17
  def update(attrs)
16
- s = load_selection!("project")
18
+ s = load_selection!(self.class)
17
19
  attrs = JSON.parse(File.readable?(attrs) ? File.read(attrs) : attrs)
18
20
  put_json("/admin/project/#{s['id']}/edit", {"project" => attrs})
19
21
  end
20
22
 
21
23
  desc "create NAME", "Create a new #{resource_name} with NAME"
22
24
  def create(name)
23
- o = load_selection!(Organization.parameter_name)
25
+ o = load_selection!(Organization)
24
26
  params = {
25
27
  parameter_name => {
26
28
  "organization_id" => o["id"],
@@ -7,11 +7,16 @@ module Magellan
7
7
  module Resources
8
8
 
9
9
  class Stage < Base
10
+ include Deletable
11
+
10
12
  self.resource_key = "stage~title"
11
- self.resource_dependency = {"project" => "project"}
13
+ self.resource_dependency = {"project" => Project.parameter_name}
12
14
  self.hidden_fields = %w[nebula_id created_at updated_at].map(&:freeze).freeze
13
15
  self.field_associations = {"project_id" => {name: "project", class: "Project"} }
14
16
 
17
+ VERSION_RESOURCE_KEY = "stage~version".freeze
18
+ VERSION_PARAMETER_NAME = "stage_version".freeze
19
+
15
20
  desc "create NAME [-t development|staging|production|other]", "Create a new #{resource_name} with Name and Type"
16
21
  option :t, type: :string, default: "development", desc: "-t development|staging|production. specify Stage Type"
17
22
  def create(name)
@@ -19,7 +24,7 @@ module Magellan
19
24
  unless %w{ development staging production other }.include?(type)
20
25
  raise "Unknown Stage Type #{type}"
21
26
  end
22
- proj = load_selection!("project")
27
+ proj = load_selection!(Project)
23
28
  params = {
24
29
  parameter_name => {
25
30
  "project_id" => proj["id"],
@@ -33,24 +38,29 @@ module Magellan
33
38
 
34
39
  desc "select NAME", "Select the #{resource_name} named by NAME"
35
40
  def select(name)
41
+ if selected = load_selections[parameter_name]
42
+ deselect unless selected["name"] == name
43
+ end
44
+
36
45
  q = build_query("name" => name).update(default_query)
37
- r = update_first_result("stage", "/admin/stage~title.json", q)
46
+ r = update_first_result(parameter_name, "/admin/stage~title.json", q)
38
47
 
39
48
  # # current
40
49
  # q = build_query("title" => r["id"], "phase" => 2) # 2: current
41
- # update_first_result("stage-version", "/admin/stage~version.json", q, %w[id])
50
+ # update_first_result(VERSION_PARAMETER_NAME, "/admin/stage~version.json", q, %w[id])
42
51
 
43
52
  # # workspace
44
53
  q = build_query("title" => r["id"], "phase" => 1) # 1: workspace
45
- update_first_result("stage-version", "/admin/stage~version.json", q, %w[id])
54
+ update_first_result(VERSION_PARAMETER_NAME, "/admin/stage~version.json", q, %w[id])
46
55
  end
47
56
 
48
57
  desc "deselect", "Deselect the #{resource_name}"
49
58
  def deselect
50
59
  update_selections! do |s|
51
- s.delete("stage")
52
- s.delete("stage-version")
60
+ s.delete(parameter_name)
61
+ s.delete(VERSION_PARAMETER_NAME)
53
62
  end
63
+ deselect_dependants
54
64
  end
55
65
 
56
66
  desc "planning", "Switch to planning to build next released version"
@@ -65,15 +75,15 @@ module Magellan
65
75
 
66
76
  no_commands do
67
77
  def switch_version(phase)
68
- s = load_selection!("stage")
78
+ s = load_selection!(self.class)
69
79
  q = build_query("title" => s["id"], "phase" => phase) # 1: workspace, 2: current, 3: used
70
- update_first_result("stage-version", "/admin/stage~version.json", q, %w[id])
80
+ update_first_result(VERSION_PARAMETER_NAME, "/admin/stage~version.json", q, %w[id])
71
81
  end
72
82
  end
73
83
 
74
84
  desc "prepare", "Prepare the #{Container.resource_name.pluralize}"
75
85
  def prepare
76
- s = load_selection!("stage")
86
+ s = load_selection!(self.class)
77
87
  id = s["id"]
78
88
  r = post_json("/admin/stage~title/#{id}/simple_method_call.json", {method_name: "prepare_containers"})
79
89
  Container.new.show_list(r["result"])
@@ -87,7 +97,7 @@ module Magellan
87
97
 
88
98
  no_commands do
89
99
  def call_repair
90
- s = load_selection!("stage")
100
+ s = load_selection!(self.class)
91
101
  id = s["id"]
92
102
  post_json("/admin/stage~title/#{id}/simple_method_call.json", {method_name: "repair"})
93
103
  end
@@ -95,7 +105,7 @@ module Magellan
95
105
 
96
106
  desc "update ATTRIBUTES", "Update ATTRIBUTES of the #{resource_name}"
97
107
  def update(attrs)
98
- s = load_selection!("stage")
108
+ s = load_selection!(self.class)
99
109
  attrs = JSON.parse(File.readable?(attrs) ? File.read(attrs) : attrs)
100
110
  put_json("/admin/stage~title/#{s['id']}/edit", {"stage_title" => attrs})
101
111
  end
@@ -106,7 +116,7 @@ module Magellan
106
116
  option :t, type: :numeric, default: 600, desc: "-t timeout(seconds)"
107
117
  def release_now
108
118
  spacer = "\r" << (" " * 20)
109
- stage = load_selection!("stage")
119
+ stage = load_selection!(self.class)
110
120
  print "\rrelease starting"
111
121
  id = stage["id"]
112
122
  res0 = post_json("/admin/stage~title/#{id}/simple_method_call.json", {method_name: "release_now"})
@@ -158,7 +168,7 @@ module Magellan
158
168
 
159
169
  desc "logs", "Fetch the logs of the #{Worker.resource_name.pluralize}"
160
170
  def logs
161
- s = load_selection!("stage")
171
+ s = load_selection!(self.class)
162
172
  id = s["id"]
163
173
  obj = get_json("/admin/stage~title/#{id}/logs.json")
164
174
  if obj["value"]
@@ -170,15 +180,15 @@ module Magellan
170
180
 
171
181
  desc "set_container_num NUM", "Set the number of #{Container.resource_name.pluralize} for the selected #{Image.resource_name}"
172
182
  def set_container_num(num)
173
- s = load_selection!("stage")
174
- v = load_selection!("stage-version")
175
- i = load_selection!("container_image")
183
+ s = load_selection!(self.class)
184
+ v = load_selection!(VERSION_PARAMETER_NAME)
185
+ i = load_selection!(Image)
176
186
  post_json("/admin/stage~version/#{v["id"]}/set_container_num.json", { container_num: num, container_image_id: i["id"] })
177
187
  end
178
188
 
179
189
  desc "reload", "Reload the last selections"
180
190
  def reload
181
- s = load_selection!("stage")
191
+ s = load_selection!(self.class)
182
192
  select(s["name"])
183
193
  [Worker, Image, Container].each do |klass|
184
194
  s = (load_selections || {})[klass.parameter_name]
@@ -15,7 +15,7 @@ module Magellan
15
15
  unless %w{ reader admin }.include?(role)
16
16
  raise "ROLE should be 'reader' or 'admin'"
17
17
  end
18
- o = load_selection!(Organization.parameter_name)
18
+ o = load_selection!(Organization)
19
19
  params = {
20
20
  parameter_name => {
21
21
  "organization_id" => o["id"],
@@ -30,7 +30,7 @@ module Magellan
30
30
  =begin
31
31
  desc "invite EMAIL", "Invite a user to the #{Team.resource_name}"
32
32
  def invite(email)
33
- o = load_selection!(parameter_name)
33
+ o = load_selection!(self.class)
34
34
  params = {
35
35
  "email" => email
36
36
  }
@@ -11,7 +11,7 @@ module Magellan
11
11
 
12
12
  desc "create NAME", "Create a new #{resource_name} with NAME"
13
13
  def create(name)
14
- s = load_selection!("stage-version")
14
+ s = load_selection!(Stage::VERSION_PARAMETER_NAME)
15
15
  params = {
16
16
  self.class.parameter_name => {
17
17
  "stage_version_id" => s["id"],
@@ -6,8 +6,10 @@ module Magellan
6
6
  module Resources
7
7
 
8
8
  class Worker < Base
9
+ include Deletable
10
+
9
11
  self.resource_key = "functions~worker"
10
- self.resource_dependency = {"stage" => "stage-version"}
12
+ self.resource_dependency = {"stage" => Stage::VERSION_PARAMETER_NAME}
11
13
  self.hidden_fields = %w[created_at updated_at].map(&:freeze).freeze
12
14
  self.multiline_fields = %w[migration_command_1 migration_command_2 run_command environment_vars_yaml].map(&:freeze).freeze
13
15
  self.field_associations = {"stage_version_id" => {name: "stage", resource: "stage~version"} }
@@ -15,7 +17,7 @@ module Magellan
15
17
  desc "create NAME, IMAGE", "Create a new #{resource_name} with NAME and IMAGE"
16
18
  method_option :attributes_yaml, aliases: "-A", desc: "path to YAML file which defines attributes"
17
19
  def create(name, image_name)
18
- s = load_selection!("stage-version")
20
+ s = load_selection!(Stage::VERSION_PARAMETER_NAME)
19
21
  attrs =
20
22
  if path = options[:attributes_yaml]
21
23
  YAML.load_file(path)
@@ -41,7 +43,7 @@ module Magellan
41
43
  else
42
44
  attrs = JSON.parse(attrs)
43
45
  end
44
- w = load_selection!(parameter_name)
46
+ w = load_selection!(self.class)
45
47
  self.class.hidden_fields.each do |f| attrs.delete(f) end
46
48
  self.class.field_associations.keys.each do |f| attrs.delete(f) end
47
49
  params = {
@@ -52,7 +54,7 @@ module Magellan
52
54
 
53
55
  desc "prepare_images", "Prepare the #{Image.resource_name.pluralize} for the selected #{Worker.resource_name}"
54
56
  def prepare_images
55
- s = load_selection!("functions_worker")
57
+ s = load_selection!(Worker)
56
58
  id = s["id"]
57
59
  r = post_json("/admin/functions~worker/#{id}/simple_method_call.json", {method_name: "prepare_images"})
58
60
  Image.new.show_list(r["result"])
@@ -24,6 +24,8 @@ module Magellan
24
24
 
25
25
  autoload :Cloudsql, "magellan/cli/resources/cloudsql"
26
26
 
27
+ autoload :Deletable, "magellan/cli/resources/deletable"
28
+
27
29
 
28
30
  MAPPING =\
29
31
  {
@@ -39,6 +41,18 @@ module Magellan
39
41
  "Cloudsql" => "cloudsql",
40
42
  }
41
43
 
44
+ class << self
45
+ def concrete_classes
46
+ @concrete_classes ||= MAPPING.keys.map{|c| self.const_get(c) }
47
+ end
48
+
49
+ def dependants_on(klass)
50
+ name = klass.name.split(/::/).last
51
+ res_name = MAPPING[name] or raise "unknown class named #{klass.name}"
52
+ concrete_classes.select{|c| c.resource_dependency && !!c.resource_dependency[res_name] }
53
+ end
54
+ end
55
+
42
56
  end
43
57
  end
44
58
  end
@@ -1,5 +1,5 @@
1
1
  module Magellan
2
2
  module Cli
3
- VERSION = "0.2.19"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -5,7 +5,7 @@ describe Magellan::Cli::Resources::ClientVersion do
5
5
 
6
6
  let(:cmd){ Magellan::Cli::Resources::ClientVersion.new }
7
7
 
8
- let(:cli){ double(:cli, login_auth: {"email" => "magellan@example.com", "toekn" => "dummy"}) }
8
+ let(:cli){ double(:cli, :check_login_auth! => nil) }
9
9
  before{ allow(cmd).to receive(:cli).and_return(cli) }
10
10
 
11
11
  describe :list do
@@ -22,7 +22,7 @@ describe Magellan::Cli::Resources::ClientVersion do
22
22
  describe :success do
23
23
  let(:client_version_list_response) { [ { "id" => 1, "version" => "1.1.0" } ] }
24
24
  before do
25
- allow(cmd).to receive(:load_selections).and_return({"project" => {"id" => 1, "name" => "ProjectA"}, "stage" => {"id" => 1, "name" => "StageA"} })
25
+ allow(cmd).to receive(:load_selections).and_return({Magellan::Cli::Resources::Project.parameter_name => {"id" => 1, "name" => "ProjectA"}, Magellan::Cli::Resources::Stage.parameter_name => {"id" => 1, "name" => "StageA"} })
26
26
  expect(cmd).to receive(:post_json).with("/admin/client_version/new.json", { "client_version" => { "stage_title_id" => 1, "version" => "1.1.0" } })
27
27
  # TODO: stub in details
28
28
  # expect(cmd).to receive(:get_json).with(any_args).and_return(client_version_list_response)
@@ -5,7 +5,7 @@ describe Magellan::Cli::Resources::Organization do
5
5
 
6
6
  let(:cmd){ Magellan::Cli::Resources::Organization.new }
7
7
 
8
- let(:cli){ double(:cli, login_auth: {"email" => "magellan@example.com", "toekn" => "dummy"}) }
8
+ let(:cli){ double(:cli, :check_login_auth! => nil) }
9
9
  before{ allow(cmd).to receive(:cli).and_return(cli) }
10
10
 
11
11
  describe :list do
@@ -5,7 +5,7 @@ describe Magellan::Cli::Resources::Team do
5
5
 
6
6
  let(:cmd){ Magellan::Cli::Resources::Team.new }
7
7
 
8
- let(:cli){ double(:cli, login_auth: {"email" => "magellan@example.com", "toekn" => "dummy"}) }
8
+ let(:cli){ double(:cli, :check_login_auth! => nil) }
9
9
  before{ allow(cmd).to receive(:cli).and_return(cli) }
10
10
 
11
11
  describe :list do
@@ -22,7 +22,7 @@ describe Magellan::Cli::Resources::Team do
22
22
  describe :success do
23
23
  let(:team_list_response) { [{"id" => 1, "name" => "team1"}] }
24
24
  before do
25
- allow(cmd).to receive(:load_selections).and_return({"magellan_auth_organization" => {"id" => 1, "name" => "org1"}})
25
+ allow(cmd).to receive(:load_selections).and_return({ Magellan::Cli::Resources::Organization.parameter_name => {"id" => 1, "name" => "org1"}})
26
26
  expect(cmd).to receive(:post_json).with("/admin/magellan~auth~team/new.json", { "magellan_auth_team" => { "organization_id" => 1, "name" => "team1", "role" => role } })
27
27
  # TODO: stub in details...
28
28
  allow(cmd).to receive(:get_json).with(any_args).and_return(team_list_response)
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.19
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - akm2000
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-08 00:00:00.000000000 Z
11
+ date: 2015-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
@@ -154,6 +154,7 @@ files:
154
154
  - lib/magellan/cli/resources/client_version.rb
155
155
  - lib/magellan/cli/resources/cloudsql.rb
156
156
  - lib/magellan/cli/resources/container.rb
157
+ - lib/magellan/cli/resources/deletable.rb
157
158
  - lib/magellan/cli/resources/image.rb
158
159
  - lib/magellan/cli/resources/organization.rb
159
160
  - lib/magellan/cli/resources/project.rb