vagrant-cloudcenter 0.2.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 +7 -0
- data/README.md +143 -0
- data/lib/vagrant-cloudcenter/action/deploy.rb +146 -0
- data/lib/vagrant-cloudcenter/action/is_created.rb +88 -0
- data/lib/vagrant-cloudcenter/action/is_stopped.rb +97 -0
- data/lib/vagrant-cloudcenter/action/read_ssh_info.rb +90 -0
- data/lib/vagrant-cloudcenter/action/read_state.rb +28 -0
- data/lib/vagrant-cloudcenter/action/start_instance.rb +137 -0
- data/lib/vagrant-cloudcenter/action/stop_instance.rb +129 -0
- data/lib/vagrant-cloudcenter/action/terminate_instance.rb +131 -0
- data/lib/vagrant-cloudcenter/action.rb +229 -0
- data/lib/vagrant-cloudcenter/command/app.rb +74 -0
- data/lib/vagrant-cloudcenter/command/catalog.rb +117 -0
- data/lib/vagrant-cloudcenter/command/init.rb +50 -0
- data/lib/vagrant-cloudcenter/command/jobs.rb +121 -0
- data/lib/vagrant-cloudcenter/command/root.rb +94 -0
- data/lib/vagrant-cloudcenter/command/sync.rb +29 -0
- data/lib/vagrant-cloudcenter/config.rb +36 -0
- data/lib/vagrant-cloudcenter/errors.rb +40 -0
- data/lib/vagrant-cloudcenter/plugin.rb +74 -0
- data/lib/vagrant-cloudcenter/provider.rb +51 -0
- data/lib/vagrant-cloudcenter/util/timer.rb +17 -0
- data/lib/vagrant-cloudcenter/version.rb +3 -0
- data/lib/vagrant-cloudcenter.rb +18 -0
- data/locales/en.yml +33 -0
- metadata +137 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
require "log4r"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
require 'vagrant/util/retryable'
|
5
|
+
|
6
|
+
require 'vagrant-cloudcenter/util/timer'
|
7
|
+
|
8
|
+
module VagrantPlugins
|
9
|
+
module Cloudcenter
|
10
|
+
module Action
|
11
|
+
# This starts a stopped instance.
|
12
|
+
class StartInstance
|
13
|
+
include Vagrant::Util::Retryable
|
14
|
+
|
15
|
+
def initialize(app, env)
|
16
|
+
@app = app
|
17
|
+
@logger = Log4r::Logger.new("cloudcenter::action::start_instance")
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(env)
|
21
|
+
if !File.exists?(env[:machine].provider_config.deployment_config)
|
22
|
+
puts "Missing deployment_config file"
|
23
|
+
exit
|
24
|
+
end
|
25
|
+
|
26
|
+
countdown = 24
|
27
|
+
|
28
|
+
if !env[:machine_name]
|
29
|
+
deployment_config = JSON.parse(File.read(env[:machine].provider_config.deployment_config))
|
30
|
+
env[:machine_name] = deployment_config["name"]
|
31
|
+
end
|
32
|
+
|
33
|
+
access_key = env[:machine].provider_config.access_key
|
34
|
+
host_ip = env[:machine].provider_config.host_ip
|
35
|
+
username = env[:machine].provider_config.username
|
36
|
+
|
37
|
+
begin
|
38
|
+
encoded = URI.encode("https://#{username}:#{access_key}@#{host_ip}/v2/jobs?search=[deploymentEntity.name,fle,#{env[:machine_name]}]");
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
response = JSON.parse(RestClient::Request.execute(
|
43
|
+
:method => :get,
|
44
|
+
:url => encoded,
|
45
|
+
:verify_ssl => false,
|
46
|
+
:accept => "json",
|
47
|
+
:headers => {"Content-Type" => "application/json"}
|
48
|
+
|
49
|
+
));
|
50
|
+
if !response["jobs"].empty?
|
51
|
+
jobID = response["jobs"][0]["id"]
|
52
|
+
end
|
53
|
+
|
54
|
+
rescue => e
|
55
|
+
error = JSON.parse(e.response)
|
56
|
+
code = error["errors"][0]["code"]
|
57
|
+
|
58
|
+
puts "\n Error code: #{error['errors'][0]['code']}\n"
|
59
|
+
puts "\n #{error['errors'][0]['message']}\n\n"
|
60
|
+
|
61
|
+
exit
|
62
|
+
end
|
63
|
+
|
64
|
+
if !jobID.nil?
|
65
|
+
begin
|
66
|
+
encoded = URI.encode("https://#{username}:#{access_key}@#{host_ip}/v2/jobs/#{jobID}");
|
67
|
+
|
68
|
+
payload = { "action" => "RESUME" }
|
69
|
+
|
70
|
+
payload = JSON.generate(payload)
|
71
|
+
|
72
|
+
response = JSON.parse(RestClient::Request.execute(
|
73
|
+
:method => :put,
|
74
|
+
:url => encoded,
|
75
|
+
:verify_ssl => false,
|
76
|
+
:accept => "json",
|
77
|
+
:payload => payload,
|
78
|
+
:headers => {"Content-Type" => "application/json"}
|
79
|
+
));
|
80
|
+
|
81
|
+
rescue => e
|
82
|
+
|
83
|
+
error = JSON.parse(e.response)
|
84
|
+
code = error["errors"][0]["code"]
|
85
|
+
|
86
|
+
puts "\n Error code: #{error['errors'][0]['code']}\n"
|
87
|
+
puts "\n #{error['errors'][0]['message']}\n\n"
|
88
|
+
|
89
|
+
exit
|
90
|
+
end
|
91
|
+
|
92
|
+
while (countdown > 0 )
|
93
|
+
|
94
|
+
countdown -= 1
|
95
|
+
|
96
|
+
begin
|
97
|
+
encoded = URI.encode("https://#{username}:#{access_key}@#{host_ip}/v2/jobs/#{jobID}");
|
98
|
+
|
99
|
+
response = JSON.parse(RestClient::Request.execute(
|
100
|
+
:method => :get,
|
101
|
+
:url => encoded,
|
102
|
+
:verify_ssl => false,
|
103
|
+
:accept => "json"
|
104
|
+
|
105
|
+
))
|
106
|
+
rescue => e
|
107
|
+
error = JSON.parse(e.response)
|
108
|
+
code = error["errors"][0]["code"]
|
109
|
+
|
110
|
+
puts "\n Error code: #{error['errors'][0]['code']}\n"
|
111
|
+
puts "\n #{error['errors'][0]['message']}\n\n"
|
112
|
+
|
113
|
+
exit
|
114
|
+
end
|
115
|
+
|
116
|
+
if response["deploymentEntity"]["attributes"]["status"] == "Deployed"
|
117
|
+
env[:state] = :stopped
|
118
|
+
env[:ui].info(I18n.t("cloudcenter.ready"))
|
119
|
+
break
|
120
|
+
else
|
121
|
+
env[:ui].info(I18n.t("cloudcenter.starting"))
|
122
|
+
end
|
123
|
+
|
124
|
+
sleep 20
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
@app.call(env)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Cloudcenter
|
5
|
+
module Action
|
6
|
+
# This stops the running instance.
|
7
|
+
class StopInstance
|
8
|
+
|
9
|
+
def initialize(app, env)
|
10
|
+
@app = app
|
11
|
+
@logger = Log4r::Logger.new("cloudcenter::action::stop_instance")
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
countdown = 24
|
16
|
+
|
17
|
+
if !File.exists?(env[:machine].provider_config.deployment_config)
|
18
|
+
puts "Missing deployment_config file"
|
19
|
+
exit
|
20
|
+
end
|
21
|
+
|
22
|
+
if !env[:machine_name]
|
23
|
+
deployment_config = JSON.parse(File.read(env[:machine].provider_config.deployment_config))
|
24
|
+
env[:machine_name] = deployment_config["name"]
|
25
|
+
end
|
26
|
+
|
27
|
+
access_key = env[:machine].provider_config.access_key
|
28
|
+
host_ip = env[:machine].provider_config.host_ip
|
29
|
+
username = env[:machine].provider_config.username
|
30
|
+
|
31
|
+
begin
|
32
|
+
encoded = URI.encode("https://#{username}:#{access_key}@#{host_ip}/v2/jobs?search=[deploymentEntity.name,fle,#{env[:machine_name]}]");
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
response = JSON.parse(RestClient::Request.execute(
|
37
|
+
:method => :get,
|
38
|
+
:url => encoded,
|
39
|
+
:verify_ssl => false,
|
40
|
+
:accept => "json",
|
41
|
+
:headers => {"Content-Type" => "application/json"}
|
42
|
+
|
43
|
+
));
|
44
|
+
if !response["jobs"].empty?
|
45
|
+
jobID = response["jobs"][0]["id"]
|
46
|
+
end
|
47
|
+
|
48
|
+
rescue => e
|
49
|
+
error = JSON.parse(e.response)
|
50
|
+
code = error["errors"][0]["code"]
|
51
|
+
|
52
|
+
puts "\n Error code: #{error['errors'][0]['code']}\n"
|
53
|
+
puts "\n #{error['errors'][0]['message']}\n\n"
|
54
|
+
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
|
58
|
+
if !jobID.nil?
|
59
|
+
begin
|
60
|
+
encoded = URI.encode("https://#{username}:#{access_key}@#{host_ip}/v2/jobs/#{jobID}");
|
61
|
+
|
62
|
+
payload = { "action" => "SUSPEND" }
|
63
|
+
|
64
|
+
payload = JSON.generate(payload)
|
65
|
+
|
66
|
+
response = JSON.parse(RestClient::Request.execute(
|
67
|
+
:method => :put,
|
68
|
+
:url => encoded,
|
69
|
+
:verify_ssl => false,
|
70
|
+
:accept => "json",
|
71
|
+
:payload => payload,
|
72
|
+
:headers => {"Content-Type" => "application/json"}
|
73
|
+
));
|
74
|
+
|
75
|
+
rescue => e
|
76
|
+
error = JSON.parse(e.response)
|
77
|
+
code = error["errors"][0]["code"]
|
78
|
+
|
79
|
+
puts "\n Error code: #{error['errors'][0]['code']}\n"
|
80
|
+
puts "\n #{error['errors'][0]['message']}\n\n"
|
81
|
+
|
82
|
+
exit
|
83
|
+
end
|
84
|
+
|
85
|
+
while (countdown > 0 )
|
86
|
+
|
87
|
+
countdown -= 1
|
88
|
+
|
89
|
+
begin
|
90
|
+
encoded = URI.encode("https://#{username}:#{access_key}@#{host_ip}/v2/jobs/#{jobID}");
|
91
|
+
|
92
|
+
response = JSON.parse(RestClient::Request.execute(
|
93
|
+
:method => :get,
|
94
|
+
:url => encoded,
|
95
|
+
:verify_ssl => false,
|
96
|
+
:accept => "json"
|
97
|
+
|
98
|
+
))
|
99
|
+
rescue => e
|
100
|
+
error = JSON.parse(e.response)
|
101
|
+
code = error["errors"][0]["code"]
|
102
|
+
|
103
|
+
puts "\n Error code: #{error['errors'][0]['code']}\n"
|
104
|
+
puts "\n #{error['errors'][0]['message']}\n\n"
|
105
|
+
|
106
|
+
exit
|
107
|
+
end
|
108
|
+
|
109
|
+
if response["deploymentEntity"]["attributes"]["status"] == "Suspended"
|
110
|
+
env[:state] = :stopped
|
111
|
+
env[:ui].info(I18n.t("cloudcenter.stopped"))
|
112
|
+
break
|
113
|
+
else
|
114
|
+
env[:ui].info(I18n.t("cloudcenter.stopping"))
|
115
|
+
end
|
116
|
+
|
117
|
+
sleep 20
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
@app.call(env)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
require 'vagrant/util/retryable'
|
4
|
+
|
5
|
+
require 'vagrant-cloudcenter/util/timer'
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module Cloudcenter
|
9
|
+
module Action
|
10
|
+
# This starts a stopped instance.
|
11
|
+
class TerminateInstance
|
12
|
+
include Vagrant::Util::Retryable
|
13
|
+
|
14
|
+
def initialize(app, env)
|
15
|
+
@app = app
|
16
|
+
@logger = Log4r::Logger.new("cloudcenter::action::start_instance")
|
17
|
+
end
|
18
|
+
|
19
|
+
def call(env)
|
20
|
+
|
21
|
+
if !File.exists?(env[:machine].provider_config.deployment_config)
|
22
|
+
puts "Missing deployment_config file"
|
23
|
+
exit
|
24
|
+
end
|
25
|
+
|
26
|
+
countdown = 24
|
27
|
+
|
28
|
+
if !env[:machine_name]
|
29
|
+
deployment_config = JSON.parse(File.read(env[:machine].provider_config.deployment_config))
|
30
|
+
env[:machine_name] = deployment_config["name"]
|
31
|
+
end
|
32
|
+
|
33
|
+
access_key = env[:machine].provider_config.access_key
|
34
|
+
host_ip = env[:machine].provider_config.host_ip
|
35
|
+
username = env[:machine].provider_config.username
|
36
|
+
|
37
|
+
begin
|
38
|
+
encoded = URI.encode("https://#{username}:#{access_key}@#{host_ip}/v2/jobs?search=[deploymentEntity.name,fle,#{env[:machine_name]}]");
|
39
|
+
|
40
|
+
response = JSON.parse(RestClient::Request.execute(
|
41
|
+
:method => :get,
|
42
|
+
:url => encoded,
|
43
|
+
:verify_ssl => false,
|
44
|
+
:accept => "json",
|
45
|
+
:headers => {"Content-Type" => "application/json"}
|
46
|
+
|
47
|
+
));
|
48
|
+
if !response["jobs"].empty?
|
49
|
+
jobID = response["jobs"][0]["id"]
|
50
|
+
end
|
51
|
+
|
52
|
+
rescue => e
|
53
|
+
error = JSON.parse(e.response)
|
54
|
+
code = error["errors"][0]["code"]
|
55
|
+
|
56
|
+
puts "\n Error code: #{error['errors'][0]['code']}\n"
|
57
|
+
puts "\n #{error['errors'][0]['message']}\n\n"
|
58
|
+
|
59
|
+
exit
|
60
|
+
end
|
61
|
+
|
62
|
+
if !jobID.nil?
|
63
|
+
begin
|
64
|
+
encoded = URI.encode("https://#{username}:#{access_key}@#{host_ip}/v2/jobs/#{jobID}");
|
65
|
+
|
66
|
+
response = JSON.parse(RestClient::Request.execute(
|
67
|
+
:method => :delete,
|
68
|
+
:url => encoded,
|
69
|
+
:verify_ssl => false,
|
70
|
+
:accept => "json"
|
71
|
+
));
|
72
|
+
|
73
|
+
rescue => e
|
74
|
+
error = JSON.parse(e.response)
|
75
|
+
code = error["errors"][0]["code"]
|
76
|
+
|
77
|
+
puts "\n Error code: #{error['errors'][0]['code']}\n"
|
78
|
+
puts "\n #{error['errors'][0]['message']}\n\n"
|
79
|
+
|
80
|
+
exit
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
while (countdown > 0 )
|
85
|
+
|
86
|
+
countdown -= 1
|
87
|
+
|
88
|
+
begin
|
89
|
+
encoded = URI.encode("https://#{username}:#{access_key}@#{host_ip}/v2/jobs?search=[deploymentEntity.name,fle,#{env[:machine_name]}]");
|
90
|
+
|
91
|
+
response = JSON.parse(RestClient::Request.execute(
|
92
|
+
:method => :get,
|
93
|
+
:url => encoded,
|
94
|
+
:verify_ssl => false,
|
95
|
+
:accept => "json",
|
96
|
+
:headers => {"Content-Type" => "application/json"}
|
97
|
+
));
|
98
|
+
|
99
|
+
rescue => e
|
100
|
+
error = JSON.parse(e.response)
|
101
|
+
code = error["errors"][0]["code"]
|
102
|
+
|
103
|
+
puts "\n Error code: #{error['errors'][0]['code']}\n"
|
104
|
+
puts "\n #{error['errors'][0]['message']}\n\n"
|
105
|
+
|
106
|
+
exit
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
if response["jobs"].empty?
|
111
|
+
env[:state] = nil?
|
112
|
+
env[:ui].info(I18n.t("cloudcenter.terminated"))
|
113
|
+
break
|
114
|
+
else
|
115
|
+
env[:ui].info(I18n.t("cloudcenter.terminating"))
|
116
|
+
end
|
117
|
+
|
118
|
+
sleep 20
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
@app.call(env)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,229 @@
|
|
1
|
+
require "pathname"
|
2
|
+
|
3
|
+
require "vagrant/action/builder"
|
4
|
+
require_relative "action/deploy"
|
5
|
+
require_relative "action/read_state"
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module Cloudcenter
|
9
|
+
module Action
|
10
|
+
# Include the built-in modules so we can use them as top-level things.
|
11
|
+
include Vagrant::Action::Builtin
|
12
|
+
|
13
|
+
action_root = Pathname.new(File.expand_path("../action", __FILE__))
|
14
|
+
autoload :Deploy, action_root.join("deploy")
|
15
|
+
autoload :IsCreated, action_root.join("is_created")
|
16
|
+
autoload :IsStopped, action_root.join("is_stopped")
|
17
|
+
autoload :MessageAlreadyCreated, action_root.join("message_already_created")
|
18
|
+
autoload :MessageNotCreated, action_root.join("message_not_created")
|
19
|
+
autoload :PackageInstance, action_root.join("package_instance")
|
20
|
+
autoload :ReadSSHInfo, action_root.join("read_ssh_info")
|
21
|
+
autoload :ReadState, action_root.join("read_state")
|
22
|
+
autoload :RunInstance, action_root.join("run_instance")
|
23
|
+
autoload :StartInstance, action_root.join("start_instance")
|
24
|
+
autoload :StopInstance, action_root.join("stop_instance")
|
25
|
+
autoload :TerminateInstance, action_root.join("terminate_instance")
|
26
|
+
autoload :TimedProvision, action_root.join("timed_provision") # some plugins now expect this action to exist
|
27
|
+
autoload :WaitForState, action_root.join("wait_for_state")
|
28
|
+
autoload :WarnNetworks, action_root.join("warn_networks")
|
29
|
+
|
30
|
+
def self.action_prepare_boot
|
31
|
+
Vagrant::Action::Builder.new.tap do |b|
|
32
|
+
b.use Provision
|
33
|
+
b.use SyncedFolders
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# This action is called to destroy the remote machine.
|
38
|
+
def self.action_destroy
|
39
|
+
Vagrant::Action::Builder.new.tap do |b|
|
40
|
+
b.use Call, DestroyConfirm do |env, b1|
|
41
|
+
if env[:result]
|
42
|
+
b1.use ConfigValidate
|
43
|
+
b1.use Call, IsCreated do |env, b2|
|
44
|
+
if env[:result] != :created
|
45
|
+
env[:ui].info(I18n.t("cloudcenter.not_created"))
|
46
|
+
else
|
47
|
+
b2.use TerminateInstance
|
48
|
+
end
|
49
|
+
end
|
50
|
+
else
|
51
|
+
env[:ui].info(I18n.t("cloudcenter.will_not_destroy", name: env[:machine].name))
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# This action is called to halt the remote machine.
|
59
|
+
def self.action_halt
|
60
|
+
Vagrant::Action::Builder.new.tap do |b|
|
61
|
+
b.use ConfigValidate
|
62
|
+
b.use Call, IsCreated do |env, b1|
|
63
|
+
if env[:result] != :created
|
64
|
+
env[:ui].info(I18n.t("cloudcenter.not_created"))
|
65
|
+
else
|
66
|
+
b1.use Call, IsStopped do |env2, b2|
|
67
|
+
if env2[:result] != :stopped
|
68
|
+
env2[:ui].info(I18n.t("cloudcenter.stopping"))
|
69
|
+
b2.use StopInstance
|
70
|
+
else
|
71
|
+
env2[:ui].info(I18n.t("cloudcenter.already_stopped"))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# This action is called to resume the remote machine.
|
80
|
+
def self.action_resume
|
81
|
+
Vagrant::Action::Builder.new.tap do |b|
|
82
|
+
b.use ConfigValidate
|
83
|
+
b.use Call, IsCreated do |env, b1|
|
84
|
+
if env[:result] != :created
|
85
|
+
env[:ui].info(I18n.t("cloudcenter.not_created"))
|
86
|
+
else
|
87
|
+
b1.use Call, IsStopped do |env2, b2|
|
88
|
+
if env2[:result] == :stopped
|
89
|
+
env2[:ui].info(I18n.t("cloudcenter.starting"))
|
90
|
+
b2.use action_prepare_boot
|
91
|
+
b2.use StartInstance
|
92
|
+
else
|
93
|
+
env2[:ui].info(I18n.t("cloudcenter.already_running"))
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
# This action is called to read the SSH info of the machine. The
|
103
|
+
# resulting state is expected to be put into the `:machine_ssh_info`
|
104
|
+
# key.
|
105
|
+
def self.action_read_ssh_info
|
106
|
+
Vagrant::Action::Builder.new.tap do |b|
|
107
|
+
b.use ConfigValidate
|
108
|
+
b.use ReadSSHInfo
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# This action is called to SSH into the machine.
|
113
|
+
def self.action_ssh
|
114
|
+
Vagrant::Action::Builder.new.tap do |b|
|
115
|
+
b.use ConfigValidate
|
116
|
+
|
117
|
+
b.use Call, IsCreated do |env, b2|
|
118
|
+
|
119
|
+
if env[:result] != :created
|
120
|
+
env[:ui].info(I18n.t("cloudcenter.not_created"))
|
121
|
+
else
|
122
|
+
b2.use ReadSSHInfo
|
123
|
+
b2.use SSHExec
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# This action is called to read the state of the machine. The
|
131
|
+
# resulting state is expected to be put into the `:machine_state_id`
|
132
|
+
# key.
|
133
|
+
def self.action_read_state
|
134
|
+
Vagrant::Action::Builder.new.tap do |b|
|
135
|
+
b.use ConfigValidate
|
136
|
+
b.use ReadState
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# This action is called to bring the box up from nothing.
|
141
|
+
def self.action_up
|
142
|
+
Vagrant::Action::Builder.new.tap do |b|
|
143
|
+
b.use HandleBox
|
144
|
+
b.use ConfigValidate
|
145
|
+
b.use BoxCheckOutdated
|
146
|
+
b.use ReadState
|
147
|
+
b.use Call, IsCreated do |env1, b1|
|
148
|
+
if env1[:result] == :created
|
149
|
+
b1.use Call, IsStopped do |env2, b2|
|
150
|
+
if env2[:result] == :stopped
|
151
|
+
env2[:ui].info(I18n.t("cloudcenter.starting"))
|
152
|
+
b2.use action_prepare_boot
|
153
|
+
b2.use StartInstance
|
154
|
+
else
|
155
|
+
env2[:ui].info(I18n.t("cloudcenter.already_running"))
|
156
|
+
end
|
157
|
+
end
|
158
|
+
else
|
159
|
+
env1[:ui].info(I18n.t("cloudcenter.deploying"))
|
160
|
+
b1.use action_prepare_boot
|
161
|
+
b1.use Deploy
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.action_sync
|
169
|
+
Vagrant::Action::Builder.new.tap do |b|
|
170
|
+
b.use ConfigValidate
|
171
|
+
b.use Call, IsCreated do |env, b1|
|
172
|
+
if env[:result] != :created
|
173
|
+
env[:ui].info(I18n.t("cloudcenter.not_created"))
|
174
|
+
else
|
175
|
+
b1.use ReadSSHInfo
|
176
|
+
b1.use SyncedFolders
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
|
184
|
+
# This action is called when `vagrant provision` is called.
|
185
|
+
def self.action_provision
|
186
|
+
Vagrant::Action::Builder.new.tap do |b|
|
187
|
+
b.use ConfigValidate
|
188
|
+
b.use Call, IsCreated do |env, b2|
|
189
|
+
if env[:result] != :created
|
190
|
+
env[:ui].info(I18n.t("cloudcenter.not_created"))
|
191
|
+
else
|
192
|
+
b2.use Provision
|
193
|
+
end
|
194
|
+
|
195
|
+
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# The current implementation uses the CloudCenter Jobs API which starts/stops the entire job instead of an individual VM which requires
|
201
|
+
# knowledge of the VM ID. There is no reboot/reload option for the jobs API so instead we will stop the job and then start the job
|
202
|
+
def self.action_reload
|
203
|
+
Vagrant::Action::Builder.new.tap do |b|
|
204
|
+
b.use ConfigValidate
|
205
|
+
b.use Call, IsCreated do |env1, b1|
|
206
|
+
if env1[:result] == :created
|
207
|
+
b1.use Call, IsStopped do |env2, b2|
|
208
|
+
if env2[:result] == :stopped
|
209
|
+
env2[:ui].info(I18n.t("cloudcenter.already_stopped"))
|
210
|
+
env2[:ui].info(I18n.t("cloudcenter.starting"))
|
211
|
+
b2.use action_prepare_boot
|
212
|
+
b2.use StartInstance
|
213
|
+
else
|
214
|
+
b2.use StopInstance
|
215
|
+
b2.use action_prepare_boot
|
216
|
+
b2.use StartInstance
|
217
|
+
end
|
218
|
+
end
|
219
|
+
else
|
220
|
+
env[:ui].info(I18n.t("cloudcenter.not_created"))
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Cloudcenter
|
3
|
+
module Command
|
4
|
+
class App < Vagrant.plugin("2", :command)
|
5
|
+
def self.synopsis
|
6
|
+
"Retrieve application details"
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
|
11
|
+
RestClient.log = 'stdout'
|
12
|
+
# Get the rest API key for authentication
|
13
|
+
|
14
|
+
|
15
|
+
host_ip = ENV['host_ip']
|
16
|
+
access_key = ENV['access_key']
|
17
|
+
username = ENV['username']
|
18
|
+
|
19
|
+
options = {}
|
20
|
+
options[:force] = false
|
21
|
+
|
22
|
+
opts = OptionParser.new do |o|
|
23
|
+
o.banner = "Usage: vagrant cloudcenter app [application-id]"
|
24
|
+
o.separator ""
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# Parse the options
|
29
|
+
argv = parse_options(opts)
|
30
|
+
|
31
|
+
puts argv[0]
|
32
|
+
|
33
|
+
begin
|
34
|
+
|
35
|
+
if argv[0] && argv[0].match(/\A\d+\z/)
|
36
|
+
|
37
|
+
encoded = URI.encode("https://#{username}:#{access_key}@#{host_ip}/v1/apps/#{argv[0]}");
|
38
|
+
|
39
|
+
catalog = JSON.parse(RestClient::Request.execute(
|
40
|
+
:method => :get,
|
41
|
+
:url => encoded,
|
42
|
+
:verify_ssl => false,
|
43
|
+
:content_type => "json",
|
44
|
+
:accept => "json"
|
45
|
+
));
|
46
|
+
puts JSON.pretty_generate(catalog)
|
47
|
+
|
48
|
+
end
|
49
|
+
rescue => e
|
50
|
+
|
51
|
+
if e.inspect == "Timed out connecting to server"
|
52
|
+
puts "\n#ConnectionError - Unable to connnect to CloudCenter Manager \n"
|
53
|
+
exit
|
54
|
+
else
|
55
|
+
error = JSON.parse(e.response)
|
56
|
+
code = error["errors"][0]["code"]
|
57
|
+
|
58
|
+
puts "\n Error code: #{error['errors'][0]['code']}\n"
|
59
|
+
puts "\n #{error['errors'][0]['message']}\n\n"
|
60
|
+
|
61
|
+
exit
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
0
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|