magellan-cli 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/lib/magellan/cli.rb +1 -0
- data/lib/magellan/cli/command.rb +13 -1
- data/lib/magellan/cli/file_access.rb +32 -0
- data/lib/magellan/cli/http.rb +8 -8
- data/lib/magellan/cli/login.rb +8 -21
- data/lib/magellan/cli/resources.rb +3 -1
- data/lib/magellan/cli/resources/base.rb +9 -24
- data/lib/magellan/cli/resources/client_version.rb +12 -0
- data/lib/magellan/cli/resources/container_image.rb +2 -0
- data/lib/magellan/cli/resources/container_instance.rb +2 -12
- data/lib/magellan/cli/resources/host_instance.rb +14 -27
- data/lib/magellan/cli/resources/organization.rb +24 -0
- data/lib/magellan/cli/resources/project.rb +13 -1
- data/lib/magellan/cli/resources/stage.rb +30 -0
- data/lib/magellan/cli/resources/team.rb +42 -0
- data/lib/magellan/cli/resources/transaction_router.rb +29 -0
- data/lib/magellan/cli/resources/worker_version.rb +4 -8
- data/lib/magellan/cli/version.rb +1 -1
- data/spec/magellan/cli/login_spec.rb +39 -5
- data/spec/magellan/cli/resources/client_version_spec.rb +43 -0
- data/spec/magellan/cli/resources/organization_spec.rb +27 -0
- data/spec/magellan/cli/resources/project_spec.rb +1 -1
- data/spec/magellan/cli/resources/team_spec.rb +50 -0
- metadata +12 -4
- data/lib/magellan/cli/resources/function_unit.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b50c83378c4c2e7c8992abde1d7c6b6eb2b712c2
|
4
|
+
data.tar.gz: 3e193a9ab5f4f00afa3571ba160219574cb3d3bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 140f87071bb2401945d826685ac7892a8da9c6ae8a1af162cea849e5e12e009d01b108d96dea472af50fe84bf556417c8cd6986fdec968733d2406690ca7eb17
|
7
|
+
data.tar.gz: 5cc732c2b875cc9d8425d6149824ff122cb3fff887009842b2c5940e29f51931fa69505303dddb3412ef6e2b28010086e4f1035e39ea5d86769b8bec870d2ce0
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/lib/magellan/cli.rb
CHANGED
data/lib/magellan/cli/command.rb
CHANGED
@@ -6,12 +6,15 @@ 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
|
{
|
12
|
+
"organization" => "Organization",
|
13
|
+
"team" => "Team",
|
11
14
|
"project" => "Project",
|
12
15
|
"stage" => "Stage",
|
13
16
|
"client_version" => "ClientVersion",
|
14
|
-
"
|
17
|
+
"tr" => "TransactionRouter",
|
15
18
|
"worker" => "WorkerVersion",
|
16
19
|
"instance" => "HostInstance",
|
17
20
|
"image" => "ContainerImage",
|
@@ -24,6 +27,15 @@ module Magellan
|
|
24
27
|
desc "direct SUBCOMMAND ...ARGS", "send request directly"
|
25
28
|
subcommand "direct", ::Magellan::Cli::Direct
|
26
29
|
|
30
|
+
desc "login", "login to a Magellan API server"
|
31
|
+
def login
|
32
|
+
print "email: "
|
33
|
+
email = STDIN.gets.chomp
|
34
|
+
print "password: "
|
35
|
+
password = STDIN.noecho(&:gets).chomp
|
36
|
+
puts ""
|
37
|
+
update_selections("login" => {"email" => email, "password" => password})
|
38
|
+
end
|
27
39
|
end
|
28
40
|
end
|
29
41
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Magellan
|
4
|
+
module Cli
|
5
|
+
module FileAccess
|
6
|
+
|
7
|
+
class NotSelected < StandardError
|
8
|
+
end
|
9
|
+
|
10
|
+
def load_selections
|
11
|
+
File.readable?(".magellan-cli") ? YAML.load_file(".magellan-cli") : {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def load_selection(name)
|
15
|
+
sel = load_selections
|
16
|
+
s = sel[name]
|
17
|
+
raise NotSelected, "No #{name} selected" unless s
|
18
|
+
return s
|
19
|
+
end
|
20
|
+
|
21
|
+
def update_selections(hash = nil)
|
22
|
+
sel = load_selections
|
23
|
+
sel.update(hash) if hash
|
24
|
+
yield(sel) if block_given?
|
25
|
+
open(".magellan-cli", "w") do |f|
|
26
|
+
f.chmod 0600
|
27
|
+
YAML.dump(sel, f)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/magellan/cli/http.rb
CHANGED
@@ -16,12 +16,12 @@ module Magellan
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# ログインしてGETします
|
19
|
-
# @param [String] rel_path cli.
|
19
|
+
# @param [String] rel_path cli.base_url からの相対パス
|
20
20
|
# @param [Hash] params クエリ文字列
|
21
21
|
# @return [Object] レスポンスのBODYをJSONとしてパースした結果オブジェクト
|
22
22
|
def get_json(rel_path, params = nil)
|
23
23
|
login do |cli|
|
24
|
-
url = "#{cli.
|
24
|
+
url = "#{cli.base_url}#{rel_path}"
|
25
25
|
if params && !params.empty?
|
26
26
|
url << '?' << params.map{|k,v| "%s=%s" % [CGI.escape(k.to_s), CGI.escape(v.to_s)] }.join("&")
|
27
27
|
end
|
@@ -32,7 +32,7 @@ module Magellan
|
|
32
32
|
end
|
33
33
|
|
34
34
|
# ログインしてPOSTします
|
35
|
-
# @param [String] rel_path cli.
|
35
|
+
# @param [String] rel_path cli.base_url からの相対パス
|
36
36
|
# @param [Hash] params POSTで渡されるパラメータ
|
37
37
|
# @return nil
|
38
38
|
def post(rel_path, params)
|
@@ -43,7 +43,7 @@ module Magellan
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# ログインしてJSON形式のbodyをPOSTします
|
46
|
-
# @param [String] rel_path cli.
|
46
|
+
# @param [String] rel_path cli.base_url からの相対パス
|
47
47
|
# @param [Hash] params POSTで渡されるパラメータ
|
48
48
|
# @return nil
|
49
49
|
def post_json(rel_path, params)
|
@@ -54,7 +54,7 @@ module Magellan
|
|
54
54
|
end
|
55
55
|
|
56
56
|
# ログインしてPUTします
|
57
|
-
# @param [String] rel_path cli.
|
57
|
+
# @param [String] rel_path cli.base_url からの相対パス
|
58
58
|
# @param [Hash] params PUTで渡されるパラメータ
|
59
59
|
# @return nil
|
60
60
|
def put(rel_path, params)
|
@@ -65,7 +65,7 @@ module Magellan
|
|
65
65
|
end
|
66
66
|
|
67
67
|
# ログインしてJSON形式のbodyをPUTします
|
68
|
-
# @param [String] rel_path cli.
|
68
|
+
# @param [String] rel_path cli.base_url からの相対パス
|
69
69
|
# @param [Hash] params PUTで渡されるパラメータ
|
70
70
|
# @return nil
|
71
71
|
def put_json(rel_path, params)
|
@@ -76,7 +76,7 @@ module Magellan
|
|
76
76
|
end
|
77
77
|
|
78
78
|
# ログインしてDELETEします
|
79
|
-
# @param [String] rel_path cli.
|
79
|
+
# @param [String] rel_path cli.base_url からの相対パス
|
80
80
|
# @return nil
|
81
81
|
def delete(rel_path)
|
82
82
|
login do |cli|
|
@@ -86,7 +86,7 @@ module Magellan
|
|
86
86
|
end
|
87
87
|
|
88
88
|
def process_res(cli, http_method, rel_path, *args)
|
89
|
-
res = cli.httpclient.send(http_method, "#{cli.
|
89
|
+
res = cli.httpclient.send(http_method, "#{cli.base_url}#{rel_path}", *args)
|
90
90
|
case res.status
|
91
91
|
when 200...300 then
|
92
92
|
r = JSON.parse(res.body)
|
data/lib/magellan/cli/login.rb
CHANGED
@@ -11,6 +11,7 @@ require 'active_support/core_ext/hash/keys'
|
|
11
11
|
module Magellan
|
12
12
|
module Cli
|
13
13
|
class Login
|
14
|
+
include Magellan::Cli::FileAccess
|
14
15
|
|
15
16
|
PRODUCTION_HTTP_PORT = 80
|
16
17
|
PRODUCTION_HTTPS_PORT = 443
|
@@ -19,9 +20,7 @@ module Magellan
|
|
19
20
|
DEFAULT_HTTPS_PORT = (ENV['DEFAULT_HTTPS_PORT'] || 443).to_i
|
20
21
|
|
21
22
|
attr_reader :httpclient
|
22
|
-
attr_reader :
|
23
|
-
attr_reader :base_https_url
|
24
|
-
attr_reader :ssl_disabled
|
23
|
+
attr_reader :base_url
|
25
24
|
|
26
25
|
attr_reader :auth_token
|
27
26
|
|
@@ -30,41 +29,29 @@ module Magellan
|
|
30
29
|
# @param [String] base_url_or_host 接続先の基準となるURLあるいはホスト名
|
31
30
|
# @param [Hash] options オプション
|
32
31
|
# @option options [String] :api_version APIのバージョン。デフォルトは "1.0.0"
|
33
|
-
# @option options [Boolean] :ssl_disabled SSLを無効にするかどうか。
|
34
|
-
# @option options [Integer] :https_port HTTPSで接続する際の接続先のポート番号
|
35
32
|
def initialize(base_url_or_host = nil, options = {})
|
36
33
|
base_url_or_host ||= (ENV["MAGELLAN_SITE"] || "http://localhost:3000/")
|
37
34
|
if base_url_or_host =~ URI.regexp
|
38
|
-
@
|
39
|
-
uri = URI.parse(@
|
35
|
+
@base_url = base_url_or_host.sub(/\/\Z/, '')
|
36
|
+
uri = URI.parse(@base_url)
|
40
37
|
else
|
41
38
|
if config_path = search_file(".magellan-cli.yml")
|
42
39
|
config = YAML.load_file_with_erb(config_path)
|
43
40
|
options = config[base_url_or_host.to_s].deep_symbolize_keys.update(options)
|
44
41
|
end
|
45
42
|
uri = URI::Generic.build({scheme: "http", host: base_url_or_host, port: DEFAULT_HTTP_PORT}.update(options))
|
46
|
-
@
|
43
|
+
@base_url = uri.to_s
|
47
44
|
end
|
48
|
-
@ssl_disabled = options.delete(:ssl_disabled)
|
49
|
-
@ssl_disabled ||= (uri.port == 3000)
|
50
|
-
@base_https_url = @ssl_disabled ? @base_http_url : build_https_url(uri, options[:https_port])
|
51
|
-
# @api_version = options[:api_version] || "1.0.0"
|
52
45
|
|
53
46
|
@httpclient = HTTPClient.new
|
54
47
|
@httpclient.ssl_config.verify_mode = nil # 自己署名の証明書をOKにする
|
55
48
|
end
|
56
49
|
|
57
|
-
def build_https_url(uri, port = nil)
|
58
|
-
uri.scheme = "https"
|
59
|
-
uri.port = port || (uri.port == PRODUCTION_HTTP_PORT ? PRODUCTION_HTTPS_PORT : uri.port + 1)
|
60
|
-
uri.to_s
|
61
|
-
end
|
62
|
-
|
63
50
|
def login_form_url
|
64
|
-
@login_form_url ||=
|
51
|
+
@login_form_url ||= base_url + "/users/sign_in.html"
|
65
52
|
end
|
66
53
|
def login_url
|
67
|
-
@login_url ||=
|
54
|
+
@login_url ||= base_url + "/api/sign_in.json"
|
68
55
|
end
|
69
56
|
|
70
57
|
# magellan-apiサーバに接続してログインの検証と処理を行います。
|
@@ -75,7 +62,7 @@ module Magellan
|
|
75
62
|
def login_and_status
|
76
63
|
@auth_token ||= get_auth_token
|
77
64
|
params = {
|
78
|
-
"user" =>
|
65
|
+
"user" => load_selection("login"),
|
79
66
|
"authenticity_token" => @auth_token
|
80
67
|
}.to_json
|
81
68
|
res2 = Ssl.retry_on_ssl_error("login"){ @httpclient.post(login_url, params, JSON_HEADER) }
|
@@ -10,11 +10,13 @@ module Magellan
|
|
10
10
|
module Resources
|
11
11
|
|
12
12
|
autoload :Base , "magellan/cli/resources/base"
|
13
|
+
autoload :Organization , "magellan/cli/resources/organization"
|
14
|
+
autoload :Team , "magellan/cli/resources/team"
|
13
15
|
autoload :Project , "magellan/cli/resources/project"
|
14
16
|
autoload :Stage , "magellan/cli/resources/stage"
|
15
17
|
autoload :ClientVersion , "magellan/cli/resources/client_version"
|
16
18
|
|
17
|
-
autoload :
|
19
|
+
autoload :TransactionRouter, "magellan/cli/resources/transaction_router"
|
18
20
|
autoload :WorkerVersion , "magellan/cli/resources/worker_version"
|
19
21
|
|
20
22
|
autoload :HostInstance , "magellan/cli/resources/host_instance"
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require "magellan/cli/resources"
|
3
|
+
require "magellan/cli/file_access"
|
3
4
|
|
4
5
|
require 'json'
|
5
6
|
require 'yaml'
|
@@ -11,36 +12,14 @@ module Magellan
|
|
11
12
|
module Cli
|
12
13
|
module Resources
|
13
14
|
|
14
|
-
class NotSelected < StandardError
|
15
|
-
end
|
16
|
-
|
17
15
|
class NotFound < StandardError
|
18
16
|
end
|
19
17
|
|
20
18
|
class Base < ::Magellan::Cli::Http
|
19
|
+
include Magellan::Cli::FileAccess
|
21
20
|
|
22
21
|
no_commands do
|
23
22
|
|
24
|
-
def load_selections
|
25
|
-
File.readable?(".magellan-cli") ? YAML.load_file(".magellan-cli") : {}
|
26
|
-
end
|
27
|
-
|
28
|
-
def load_selection(name)
|
29
|
-
sel = load_selections
|
30
|
-
s = sel[name]
|
31
|
-
raise NotSelected, "No #{name} selected" unless s
|
32
|
-
return s
|
33
|
-
end
|
34
|
-
|
35
|
-
def update_selections(hash = nil)
|
36
|
-
sel = load_selections
|
37
|
-
sel.update(hash) if hash
|
38
|
-
yield(sel) if block_given?
|
39
|
-
open(".magellan-cli", "w") do |f|
|
40
|
-
YAML.dump(sel, f)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
23
|
def build_query(hash)
|
45
24
|
@@no ||= 0
|
46
25
|
r = {}
|
@@ -88,7 +67,7 @@ module Magellan
|
|
88
67
|
|
89
68
|
def select(name)
|
90
69
|
q = build_query("name" => name).update(default_query)
|
91
|
-
update_first_result(self.class.
|
70
|
+
update_first_result(self.class.parameter_name, "/admin/#{self.class.resource_name}.json", q)
|
92
71
|
end
|
93
72
|
|
94
73
|
def deselect
|
@@ -104,6 +83,12 @@ module Magellan
|
|
104
83
|
no_commands do
|
105
84
|
cattr_accessor :resource_name
|
106
85
|
cattr_accessor :resource_dependency
|
86
|
+
def self.parameter_name
|
87
|
+
resource_name.gsub(/~/, "_")
|
88
|
+
end
|
89
|
+
def parameter_name
|
90
|
+
self.class.parameter_name
|
91
|
+
end
|
107
92
|
end
|
108
93
|
|
109
94
|
desc "list", "list #{base_name}"
|
@@ -8,6 +8,18 @@ module Magellan
|
|
8
8
|
class ClientVersion < Base
|
9
9
|
self.resource_name = "client_version"
|
10
10
|
self.resource_dependency = {"stage" => "stage"}
|
11
|
+
|
12
|
+
desc "create VERSION", "create New Client Version"
|
13
|
+
def create(version)
|
14
|
+
stage = load_selection("stage")
|
15
|
+
params = {
|
16
|
+
parameter_name => {
|
17
|
+
"stage_title_id" => stage["id"],
|
18
|
+
"version" => version,
|
19
|
+
}
|
20
|
+
}
|
21
|
+
post_json("/admin/#{resource_name}/new.js", params)
|
22
|
+
end
|
11
23
|
end
|
12
24
|
|
13
25
|
end
|
@@ -6,18 +6,8 @@ module Magellan
|
|
6
6
|
module Resources
|
7
7
|
|
8
8
|
class ContainerInstance < Base
|
9
|
-
self.resource_name = "
|
10
|
-
self.resource_dependency = {"
|
11
|
-
|
12
|
-
desc "start ID", "start container instance specified by ID"
|
13
|
-
def start(id)
|
14
|
-
post_json("/admin/container_instance/#{id}/status_control.json", {})
|
15
|
-
end
|
16
|
-
|
17
|
-
desc "stop ID", "stop container instance specified by ID"
|
18
|
-
def stop(id)
|
19
|
-
delete("/admin/container_instance/#{id}/status_control.json")
|
20
|
-
end
|
9
|
+
self.resource_name = "container~instance"
|
10
|
+
self.resource_dependency = {"stage" => "stage-version"}
|
21
11
|
end
|
22
12
|
|
23
13
|
end
|
@@ -6,12 +6,19 @@ module Magellan
|
|
6
6
|
module Resources
|
7
7
|
|
8
8
|
class HostInstance < Base
|
9
|
-
self.resource_name = "
|
10
|
-
self.resource_dependency = {"stage" => "stage
|
11
|
-
|
12
|
-
desc "
|
13
|
-
def
|
14
|
-
|
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}")
|
15
22
|
end
|
16
23
|
|
17
24
|
desc "create NAME [LAUNCH_OPTIONS]", "create Host Instance"
|
@@ -26,29 +33,9 @@ module Magellan
|
|
26
33
|
"launch_options_yaml" => YAML.dump(launch_options),
|
27
34
|
}
|
28
35
|
}
|
29
|
-
post_json("/admin/
|
30
|
-
end
|
31
|
-
|
32
|
-
desc "launch", "launch host instance"
|
33
|
-
def launch
|
34
|
-
id = load_selection(self.class.resource_name)["id"]
|
35
|
-
post_json("/admin/host_instance/#{id}/status_control.json", {})
|
36
|
-
end
|
37
|
-
|
38
|
-
desc "prepare", "prepare host instance"
|
39
|
-
def prepare
|
40
|
-
id = load_selection(self.class.resource_name)["id"]
|
41
|
-
put_json("/admin/host_instance/#{id}/status_control.json", {})
|
36
|
+
post_json("/admin/vm~instance/new.js", params)
|
42
37
|
end
|
43
38
|
|
44
|
-
desc "stop", "stop host instance"
|
45
|
-
def stop
|
46
|
-
id = load_selection(self.class.resource_name)["id"]
|
47
|
-
delete("/admin/host_instance/#{id}/status_control.json")
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
39
|
end
|
53
40
|
|
54
41
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "magellan/cli/resources"
|
3
|
+
|
4
|
+
module Magellan
|
5
|
+
module Cli
|
6
|
+
module Resources
|
7
|
+
|
8
|
+
class Organization < Base
|
9
|
+
self.resource_name = "magellan~auth~organization"
|
10
|
+
|
11
|
+
desc "create NAME", "create Organization with NAME"
|
12
|
+
def create(name)
|
13
|
+
params = {
|
14
|
+
parameter_name => {
|
15
|
+
"name" => name,
|
16
|
+
}
|
17
|
+
}
|
18
|
+
post_json("/admin/#{self.resource_name}/new.js", params)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -13,7 +13,19 @@ module Magellan
|
|
13
13
|
def update(attrs)
|
14
14
|
s = load_selection("project")
|
15
15
|
attrs = JSON.parse(File.readable?(attrs) ? File.read(attrs) : attrs)
|
16
|
-
put_json("/admin/
|
16
|
+
put_json("/admin/project/#{s['id']}/edit", {"project" => attrs})
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "create NAME", "create new project with NAME"
|
20
|
+
def create(name)
|
21
|
+
o = load_selection(Organization.parameter_name)
|
22
|
+
params = {
|
23
|
+
parameter_name => {
|
24
|
+
"organization_id" => o["id"],
|
25
|
+
"name" => name,
|
26
|
+
}
|
27
|
+
}
|
28
|
+
post_json("/admin/#{resource_name}/new.js", params)
|
17
29
|
end
|
18
30
|
end
|
19
31
|
|
@@ -10,6 +10,24 @@ module Magellan
|
|
10
10
|
self.resource_name = "stage~title"
|
11
11
|
self.resource_dependency = {"project" => "project"}
|
12
12
|
|
13
|
+
desc "create NAME [-t development|staging|production|other]", "create Stage with Name and Type"
|
14
|
+
option :t, type: :string, default: "development", desc: "-t development|staging|production. specify Stage Type"
|
15
|
+
def create(name)
|
16
|
+
type = options["t"]
|
17
|
+
unless %w{ development staging production other }.include?(type)
|
18
|
+
raise "Unknown Stage Type #{type}"
|
19
|
+
end
|
20
|
+
proj = load_selection("project")
|
21
|
+
params = {
|
22
|
+
parameter_name => {
|
23
|
+
"project_id" => proj["id"],
|
24
|
+
"name" => name,
|
25
|
+
"stage_type" => type,
|
26
|
+
}
|
27
|
+
}
|
28
|
+
post_json("/admin/#{resource_name}/new.js", params)
|
29
|
+
end
|
30
|
+
|
13
31
|
desc "select NAME", "select Stage named by NAME"
|
14
32
|
def select(name)
|
15
33
|
q = build_query("name" => name).update(default_query)
|
@@ -62,6 +80,18 @@ module Magellan
|
|
62
80
|
id = s["id"]
|
63
81
|
post_json("/admin/stage~title/#{id}/simple_method_call.json", {method_name: "release_now"})
|
64
82
|
end
|
83
|
+
|
84
|
+
desc "logs", "fetch worker logs"
|
85
|
+
def logs
|
86
|
+
s = load_selection("stage")
|
87
|
+
id = s["id"]
|
88
|
+
obj = get_json("/admin/stage~title/#{id}/logs.json")
|
89
|
+
if obj["value"]
|
90
|
+
obj["value"].each do |log|
|
91
|
+
puts "#{Time.at(log["time"]).strftime("%Y-%m-%d %H:%M:%S")}:#{log["version"]}:#{log["container"]}: #{log["message"]}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
65
95
|
end
|
66
96
|
|
67
97
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "magellan/cli/resources"
|
3
|
+
|
4
|
+
module Magellan
|
5
|
+
module Cli
|
6
|
+
module Resources
|
7
|
+
|
8
|
+
class Team < Base
|
9
|
+
self.resource_name = "magellan~auth~team"
|
10
|
+
self.resource_dependency = { "organization" => Organization.parameter_name }
|
11
|
+
|
12
|
+
desc "create NAME ROLE", "create Team with NAME ROLE"
|
13
|
+
def create(name, role)
|
14
|
+
unless %w{ readers admin }.include?(role)
|
15
|
+
raise "ROLE should be 'readers' or 'admin'"
|
16
|
+
end
|
17
|
+
o = load_selection(Organization.parameter_name)
|
18
|
+
params = {
|
19
|
+
parameter_name => {
|
20
|
+
"organization_id" => o["id"],
|
21
|
+
"name" => name,
|
22
|
+
"role" => role,
|
23
|
+
}
|
24
|
+
}
|
25
|
+
post_json("/admin/#{self.resource_name}/new.js", params)
|
26
|
+
end
|
27
|
+
|
28
|
+
=begin
|
29
|
+
desc "invite EMAIL", "invite a user to the Team"
|
30
|
+
def invite(email)
|
31
|
+
o = load_selection(parameter_name)
|
32
|
+
params = {
|
33
|
+
"email" => email
|
34
|
+
}
|
35
|
+
post_json("/admin/#{self.resource_name}/#{o["id"]}/team_invite.json", params)
|
36
|
+
end
|
37
|
+
=end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "magellan/cli/resources"
|
3
|
+
|
4
|
+
module Magellan
|
5
|
+
module Cli
|
6
|
+
module Resources
|
7
|
+
|
8
|
+
class TransactionRouter < Base
|
9
|
+
self.resource_name = "functions~transaction_router"
|
10
|
+
self.resource_dependency = {"stage" => Stage.parameter_name}
|
11
|
+
|
12
|
+
desc "create NAME", "create TransactionRouter with NAME"
|
13
|
+
def create(name)
|
14
|
+
s = load_selection("stage-version")
|
15
|
+
params = {
|
16
|
+
self.class.parameter_name => {
|
17
|
+
"stage_version_id" => s["id"],
|
18
|
+
"name" => name,
|
19
|
+
# "instance_base_name" => name,
|
20
|
+
}
|
21
|
+
}
|
22
|
+
post_json("/admin/#{self.resource_name}/new.js", params)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -6,7 +6,7 @@ module Magellan
|
|
6
6
|
module Resources
|
7
7
|
|
8
8
|
class WorkerVersion < Base
|
9
|
-
self.resource_name = "
|
9
|
+
self.resource_name = "functions~worker"
|
10
10
|
self.resource_dependency = {"stage" => "stage-version"}
|
11
11
|
|
12
12
|
desc "create NAME, IMAGE", "create WorkerVersion with NAME, IMAGE"
|
@@ -20,18 +20,14 @@ module Magellan
|
|
20
20
|
{}
|
21
21
|
end
|
22
22
|
params = {
|
23
|
-
"
|
23
|
+
"functions_worker" => {
|
24
24
|
"stage_version_id" => s["id"],
|
25
|
+
"name" => name,
|
25
26
|
"image_name" => image_name,
|
26
27
|
# "instance_base_name" => name,
|
27
|
-
"function_unit_attributes" => { # accepts_nested_attributes_for
|
28
|
-
"name" => name,
|
29
|
-
"kind" => "201",
|
30
|
-
"stage_version_id" => s["id"],
|
31
|
-
}
|
32
28
|
}.update(attrs)
|
33
29
|
}
|
34
|
-
post_json("/admin/
|
30
|
+
post_json("/admin/#{self.resource_name}/new.js", params)
|
35
31
|
end
|
36
32
|
|
37
33
|
end
|
data/lib/magellan/cli/version.rb
CHANGED
@@ -4,13 +4,20 @@ require 'spec_helper'
|
|
4
4
|
describe Magellan::Cli::Login do
|
5
5
|
|
6
6
|
describe :login! do
|
7
|
+
let(:email){ "magellan@groovenauts.jp" }
|
8
|
+
let(:password){ "password" }
|
7
9
|
let(:auth_token){ "047bcCC1dnyVE+7DWE6YKIJF97L/qHk1mPrf2oaqWtE=" }
|
8
10
|
|
11
|
+
before do
|
12
|
+
allow(File).to receive(:readable?).and_return(true)
|
13
|
+
allow(YAML).to receive(:load_file).with(".magellan-cli").and_return({"login" => {"email" => email, "password" => password} })
|
14
|
+
end
|
15
|
+
|
9
16
|
context :production do
|
10
|
-
let(:cli){ Magellan::Cli::Login.new("
|
17
|
+
let(:cli){ Magellan::Cli::Login.new("https://example.com") }
|
11
18
|
before do
|
12
19
|
res = double(:res)
|
13
|
-
allow(cli.httpclient).to receive(:get).with("https://example.com
|
20
|
+
allow(cli.httpclient).to receive(:get).with("https://example.com/users/sign_in.html").and_return(res)
|
14
21
|
allow(res).to receive(:status).and_return(200)
|
15
22
|
allow(res).to receive(:body).and_return(File.read(File.expand_path("../login_page.html", __FILE__)))
|
16
23
|
allow(res).to receive(:body_encoding).and_return(Encoding.find("UTF-8"))
|
@@ -18,14 +25,14 @@ describe Magellan::Cli::Login do
|
|
18
25
|
|
19
26
|
let(:params) do
|
20
27
|
{
|
21
|
-
"user" => {"email" =>
|
28
|
+
"user" => {"email" => email, "password" => password},
|
22
29
|
"authenticity_token" => auth_token,
|
23
30
|
}
|
24
31
|
end
|
25
32
|
|
26
33
|
it :login_success do
|
27
34
|
res = double(:res)
|
28
|
-
allow(cli.httpclient).to receive(:post).with("https://example.com
|
35
|
+
allow(cli.httpclient).to receive(:post).with("https://example.com/api/sign_in.json", params.to_json, Magellan::Cli::JSON_HEADER).and_return(res)
|
29
36
|
allow(res).to receive(:status).and_return(200)
|
30
37
|
allow(res).to receive(:body).and_return({"success" => true}.to_json)
|
31
38
|
allow(res).to receive(:body_encoding).and_return(Encoding.find("UTF-8"))
|
@@ -34,13 +41,40 @@ describe Magellan::Cli::Login do
|
|
34
41
|
|
35
42
|
it :login_failure do
|
36
43
|
res = double(:res)
|
37
|
-
allow(cli.httpclient).to receive(:post).with("https://example.com
|
44
|
+
allow(cli.httpclient).to receive(:post).with("https://example.com/api/sign_in.json", params.to_json, Magellan::Cli::JSON_HEADER).and_return(res)
|
38
45
|
allow(res).to receive(:status).and_return(401) # Unauthorized
|
39
46
|
allow(res).to receive(:body).and_return({"success" => false, "message" => "Error with your login or password"}.to_json)
|
40
47
|
allow(res).to receive(:body_encoding).and_return(Encoding.find("UTF-8"))
|
41
48
|
expect{cli.login!}.to raise_error(Magellan::Cli::LoginError, 'status: 401 {"success":false,"message":"Error with your login or password"}')
|
42
49
|
end
|
43
50
|
end
|
51
|
+
|
52
|
+
context :development do
|
53
|
+
let(:cli){ Magellan::Cli::Login.new("http://localhost:3001") }
|
54
|
+
before do
|
55
|
+
res = double(:res)
|
56
|
+
allow(cli.httpclient).to receive(:get).with("http://localhost:3001/users/sign_in.html").and_return(res)
|
57
|
+
allow(res).to receive(:status).and_return(200)
|
58
|
+
allow(res).to receive(:body).and_return(File.read(File.expand_path("../login_page.html", __FILE__)))
|
59
|
+
allow(res).to receive(:body_encoding).and_return(Encoding.find("UTF-8"))
|
60
|
+
end
|
61
|
+
|
62
|
+
let(:params) do
|
63
|
+
{
|
64
|
+
"user" => {"email" => email, "password" => password},
|
65
|
+
"authenticity_token" => auth_token,
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
it :login_success do
|
70
|
+
res = double(:res)
|
71
|
+
allow(cli.httpclient).to receive(:post).with("http://localhost:3001/api/sign_in.json", params.to_json, Magellan::Cli::JSON_HEADER).and_return(res)
|
72
|
+
allow(res).to receive(:status).and_return(200)
|
73
|
+
allow(res).to receive(:body).and_return({"success" => true}.to_json)
|
74
|
+
allow(res).to receive(:body_encoding).and_return(Encoding.find("UTF-8"))
|
75
|
+
expect(cli.login!).to eq cli # 自身を返す
|
76
|
+
end
|
77
|
+
end
|
44
78
|
end
|
45
79
|
|
46
80
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Magellan::Cli::Resources::ClientVersion do
|
5
|
+
|
6
|
+
let(:cmd){ Magellan::Cli::Resources::ClientVersion.new }
|
7
|
+
|
8
|
+
describe :list do
|
9
|
+
before do
|
10
|
+
expect(cmd).to receive(:load_selections).and_return({"stage" => {"id" => "1", "name" => "StageA"} })
|
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
|
+
expect($stdout).to receive(:puts)
|
13
|
+
end
|
14
|
+
it do
|
15
|
+
cmd.list
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe :create do
|
20
|
+
describe :success do
|
21
|
+
before do
|
22
|
+
expect(cmd).to receive(:load_selections).and_return({"stage" => {"id" => 1, "name" => "StageA"}})
|
23
|
+
expect(cmd).to receive(:post_json).with("/admin/client_version/new.js", { "client_version" => { "stage_title_id" => 1, "version" => "1.1.0" } })
|
24
|
+
end
|
25
|
+
it do
|
26
|
+
cmd.create("1.1.0")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
describe :error do
|
30
|
+
context "stage not selected" do
|
31
|
+
before do
|
32
|
+
expect(cmd).to receive(:load_selections).and_return({})
|
33
|
+
end
|
34
|
+
it do
|
35
|
+
expect{
|
36
|
+
cmd.create("1.1.0")
|
37
|
+
}.to raise_error(Magellan::Cli::FileAccess::NotSelected)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Magellan::Cli::Resources::Organization do
|
5
|
+
|
6
|
+
let(:cmd){ Magellan::Cli::Resources::Organization.new }
|
7
|
+
|
8
|
+
describe :list do
|
9
|
+
before do
|
10
|
+
expect(cmd).to receive(:get_json).and_return([{id: 1, name: "org1", creator_id: 1}])
|
11
|
+
expect($stdout).to receive(:puts)
|
12
|
+
end
|
13
|
+
it do
|
14
|
+
cmd.list
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe :create do
|
19
|
+
before do
|
20
|
+
expect(cmd).to receive(:post_json).with("/admin/magellan~auth~organization/new.js", {"magellan_auth_organization" => { "name" => "new1" }})
|
21
|
+
end
|
22
|
+
it do
|
23
|
+
cmd.create("new1")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -6,7 +6,7 @@ describe Magellan::Cli::Resources::Project do
|
|
6
6
|
let(:base_url){ "https://localhost:3000" }
|
7
7
|
let(:httpclient){ double(:httpclient) }
|
8
8
|
let(:cli) do
|
9
|
-
cli = double(:login,
|
9
|
+
cli = double(:login, base_url: base_url)
|
10
10
|
allow(cli).to receive(:httpclient).and_return(httpclient)
|
11
11
|
cli
|
12
12
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Magellan::Cli::Resources::Team do
|
5
|
+
|
6
|
+
let(:cmd){ Magellan::Cli::Resources::Team.new }
|
7
|
+
|
8
|
+
describe :list do
|
9
|
+
before do
|
10
|
+
expect(cmd).to receive(:load_selections).and_return({"magellan_auth_organization" => {"id" => "1", "name" => "testorg1"} })
|
11
|
+
expect(cmd).to receive(:get_json).and_return([{id: 1, organization_id: 1, name: "team1" }])
|
12
|
+
expect($stdout).to receive(:puts)
|
13
|
+
end
|
14
|
+
it do
|
15
|
+
cmd.list
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe :create do
|
20
|
+
describe :success do
|
21
|
+
before do
|
22
|
+
expect(cmd).to receive(:load_selection).with("magellan_auth_organization").and_return({"id" => 1, "name" => "org1"})
|
23
|
+
expect(cmd).to receive(:post_json).with("/admin/magellan~auth~team/new.js", { "magellan_auth_team" => { "organization_id" => 1, "name" => "team1", "role" => role } })
|
24
|
+
end
|
25
|
+
context "role=readers" do
|
26
|
+
let(:role){ "readers" }
|
27
|
+
it do
|
28
|
+
cmd.create("team1", role)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
context "role=readers" do
|
32
|
+
let(:role){ "admin" }
|
33
|
+
it do
|
34
|
+
cmd.create("team1", role)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
describe :error do
|
39
|
+
context "role=readers" do
|
40
|
+
let(:role){ "owners" }
|
41
|
+
it do
|
42
|
+
expect{
|
43
|
+
cmd.create("team1", role)
|
44
|
+
}.to raise_error(RuntimeError, /ROLE should be/)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
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.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- akm2000
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10
|
11
|
+
date: 2014-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpclient
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- lib/magellan/cli/command.rb
|
132
132
|
- lib/magellan/cli/direct.rb
|
133
133
|
- lib/magellan/cli/errors.rb
|
134
|
+
- lib/magellan/cli/file_access.rb
|
134
135
|
- lib/magellan/cli/http.rb
|
135
136
|
- lib/magellan/cli/login.rb
|
136
137
|
- lib/magellan/cli/resources.rb
|
@@ -138,10 +139,12 @@ files:
|
|
138
139
|
- lib/magellan/cli/resources/client_version.rb
|
139
140
|
- lib/magellan/cli/resources/container_image.rb
|
140
141
|
- lib/magellan/cli/resources/container_instance.rb
|
141
|
-
- lib/magellan/cli/resources/function_unit.rb
|
142
142
|
- lib/magellan/cli/resources/host_instance.rb
|
143
|
+
- lib/magellan/cli/resources/organization.rb
|
143
144
|
- lib/magellan/cli/resources/project.rb
|
144
145
|
- lib/magellan/cli/resources/stage.rb
|
146
|
+
- lib/magellan/cli/resources/team.rb
|
147
|
+
- lib/magellan/cli/resources/transaction_router.rb
|
145
148
|
- lib/magellan/cli/resources/worker_version.rb
|
146
149
|
- lib/magellan/cli/sample_launch_options.json
|
147
150
|
- lib/magellan/cli/ssl.rb
|
@@ -150,7 +153,10 @@ files:
|
|
150
153
|
- spec/magellan/cli/Magellan.yml
|
151
154
|
- spec/magellan/cli/login_page.html
|
152
155
|
- spec/magellan/cli/login_spec.rb
|
156
|
+
- spec/magellan/cli/resources/client_version_spec.rb
|
157
|
+
- spec/magellan/cli/resources/organization_spec.rb
|
153
158
|
- spec/magellan/cli/resources/project_spec.rb
|
159
|
+
- spec/magellan/cli/resources/team_spec.rb
|
154
160
|
- spec/magellan/cli_spec.rb
|
155
161
|
- spec/spec_helper.rb
|
156
162
|
homepage: ''
|
@@ -181,7 +187,9 @@ test_files:
|
|
181
187
|
- spec/magellan/cli/Magellan.yml
|
182
188
|
- spec/magellan/cli/login_page.html
|
183
189
|
- spec/magellan/cli/login_spec.rb
|
190
|
+
- spec/magellan/cli/resources/client_version_spec.rb
|
191
|
+
- spec/magellan/cli/resources/organization_spec.rb
|
184
192
|
- spec/magellan/cli/resources/project_spec.rb
|
193
|
+
- spec/magellan/cli/resources/team_spec.rb
|
185
194
|
- spec/magellan/cli_spec.rb
|
186
195
|
- spec/spec_helper.rb
|
187
|
-
has_rdoc:
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
require "magellan/cli/resources"
|
3
|
-
|
4
|
-
module Magellan
|
5
|
-
module Cli
|
6
|
-
module Resources
|
7
|
-
|
8
|
-
class FunctionUnit < Base
|
9
|
-
self.resource_name = "function_unit"
|
10
|
-
self.resource_dependency = {"stage" => "stage-version"}
|
11
|
-
|
12
|
-
desc "create [ATTRIBUTES]", "create FunctionUnit with ATTRIBUTES (filepath or JSON text)"
|
13
|
-
def create(attrs = nil)
|
14
|
-
stage_id = load_selection("stage-version")
|
15
|
-
attrs = JSON.parse(File.readable?(attrs) ? File.read(attrs) : attrs)
|
16
|
-
params = {
|
17
|
-
"function_unit" => {
|
18
|
-
"stage_version_id" => stage_id,
|
19
|
-
}.update(attrs)
|
20
|
-
}
|
21
|
-
post_json("/admin/function_unit/new.js", params)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|