startapp 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/COPYRIGHT +1 -0
- data/LICENSE +11 -0
- data/README.md +95 -0
- data/Rakefile +6 -0
- data/autocomplete/rhc_bash +1672 -0
- data/bin/app +37 -0
- data/conf/express.conf +8 -0
- data/features/assets/deploy.tar.gz +0 -0
- data/features/core_feature.rb +191 -0
- data/features/deployments_feature.rb +129 -0
- data/features/domains_feature.rb +58 -0
- data/features/keys_feature.rb +37 -0
- data/features/members_feature.rb +166 -0
- data/lib/rhc/auth/basic.rb +64 -0
- data/lib/rhc/auth/token.rb +102 -0
- data/lib/rhc/auth/token_store.rb +53 -0
- data/lib/rhc/auth.rb +5 -0
- data/lib/rhc/autocomplete.rb +66 -0
- data/lib/rhc/autocomplete_templates/bash.erb +39 -0
- data/lib/rhc/cartridge_helpers.rb +118 -0
- data/lib/rhc/cli.rb +40 -0
- data/lib/rhc/command_runner.rb +185 -0
- data/lib/rhc/commands/account.rb +25 -0
- data/lib/rhc/commands/alias.rb +124 -0
- data/lib/rhc/commands/app.rb +726 -0
- data/lib/rhc/commands/apps.rb +20 -0
- data/lib/rhc/commands/authorization.rb +115 -0
- data/lib/rhc/commands/base.rb +174 -0
- data/lib/rhc/commands/cartridge.rb +329 -0
- data/lib/rhc/commands/clone.rb +66 -0
- data/lib/rhc/commands/configure.rb +20 -0
- data/lib/rhc/commands/create.rb +100 -0
- data/lib/rhc/commands/delete.rb +19 -0
- data/lib/rhc/commands/deploy.rb +32 -0
- data/lib/rhc/commands/deployment.rb +82 -0
- data/lib/rhc/commands/domain.rb +172 -0
- data/lib/rhc/commands/env.rb +142 -0
- data/lib/rhc/commands/force_stop.rb +17 -0
- data/lib/rhc/commands/git_clone.rb +34 -0
- data/lib/rhc/commands/logout.rb +51 -0
- data/lib/rhc/commands/logs.rb +21 -0
- data/lib/rhc/commands/member.rb +148 -0
- data/lib/rhc/commands/port_forward.rb +197 -0
- data/lib/rhc/commands/reload.rb +17 -0
- data/lib/rhc/commands/restart.rb +17 -0
- data/lib/rhc/commands/scp.rb +54 -0
- data/lib/rhc/commands/server.rb +40 -0
- data/lib/rhc/commands/setup.rb +60 -0
- data/lib/rhc/commands/show.rb +43 -0
- data/lib/rhc/commands/snapshot.rb +137 -0
- data/lib/rhc/commands/ssh.rb +51 -0
- data/lib/rhc/commands/sshkey.rb +97 -0
- data/lib/rhc/commands/start.rb +17 -0
- data/lib/rhc/commands/stop.rb +17 -0
- data/lib/rhc/commands/tail.rb +47 -0
- data/lib/rhc/commands/threaddump.rb +14 -0
- data/lib/rhc/commands/tidy.rb +17 -0
- data/lib/rhc/commands.rb +396 -0
- data/lib/rhc/config.rb +321 -0
- data/lib/rhc/context_helper.rb +121 -0
- data/lib/rhc/core_ext.rb +202 -0
- data/lib/rhc/coverage_helper.rb +33 -0
- data/lib/rhc/deployment_helpers.rb +111 -0
- data/lib/rhc/exceptions.rb +256 -0
- data/lib/rhc/git_helpers.rb +106 -0
- data/lib/rhc/help_formatter.rb +55 -0
- data/lib/rhc/helpers.rb +481 -0
- data/lib/rhc/highline_extensions.rb +479 -0
- data/lib/rhc/json.rb +51 -0
- data/lib/rhc/output_helpers.rb +260 -0
- data/lib/rhc/rest/activation.rb +11 -0
- data/lib/rhc/rest/alias.rb +42 -0
- data/lib/rhc/rest/api.rb +87 -0
- data/lib/rhc/rest/application.rb +348 -0
- data/lib/rhc/rest/attributes.rb +36 -0
- data/lib/rhc/rest/authorization.rb +8 -0
- data/lib/rhc/rest/base.rb +79 -0
- data/lib/rhc/rest/cartridge.rb +162 -0
- data/lib/rhc/rest/client.rb +650 -0
- data/lib/rhc/rest/deployment.rb +18 -0
- data/lib/rhc/rest/domain.rb +98 -0
- data/lib/rhc/rest/environment_variable.rb +15 -0
- data/lib/rhc/rest/gear_group.rb +16 -0
- data/lib/rhc/rest/httpclient.rb +145 -0
- data/lib/rhc/rest/key.rb +44 -0
- data/lib/rhc/rest/membership.rb +105 -0
- data/lib/rhc/rest/mock.rb +1042 -0
- data/lib/rhc/rest/user.rb +32 -0
- data/lib/rhc/rest.rb +148 -0
- data/lib/rhc/scp_helpers.rb +27 -0
- data/lib/rhc/ssh_helpers.rb +380 -0
- data/lib/rhc/tar_gz.rb +51 -0
- data/lib/rhc/usage_templates/command_help.erb +51 -0
- data/lib/rhc/usage_templates/command_syntax_help.erb +11 -0
- data/lib/rhc/usage_templates/help.erb +61 -0
- data/lib/rhc/usage_templates/missing_help.erb +1 -0
- data/lib/rhc/usage_templates/options_help.erb +12 -0
- data/lib/rhc/vendor/okjson.rb +600 -0
- data/lib/rhc/vendor/parseconfig.rb +178 -0
- data/lib/rhc/vendor/sshkey.rb +253 -0
- data/lib/rhc/vendor/zliby.rb +628 -0
- data/lib/rhc/version.rb +5 -0
- data/lib/rhc/wizard.rb +637 -0
- data/lib/rhc.rb +34 -0
- data/spec/coverage_helper.rb +82 -0
- data/spec/direct_execution_helper.rb +339 -0
- data/spec/keys/example.pem +23 -0
- data/spec/keys/example_private.pem +27 -0
- data/spec/keys/server.pem +19 -0
- data/spec/rest_spec_helper.rb +31 -0
- data/spec/rhc/assets/cert.crt +22 -0
- data/spec/rhc/assets/cert_key_rsa +27 -0
- data/spec/rhc/assets/empty.txt +0 -0
- data/spec/rhc/assets/env_vars.txt +7 -0
- data/spec/rhc/assets/env_vars_2.txt +1 -0
- data/spec/rhc/assets/foo.txt +1 -0
- data/spec/rhc/assets/targz_corrupted.tar.gz +1 -0
- data/spec/rhc/assets/targz_sample.tar.gz +0 -0
- data/spec/rhc/auth_spec.rb +442 -0
- data/spec/rhc/cli_spec.rb +186 -0
- data/spec/rhc/command_spec.rb +435 -0
- data/spec/rhc/commands/account_spec.rb +42 -0
- data/spec/rhc/commands/alias_spec.rb +333 -0
- data/spec/rhc/commands/app_spec.rb +777 -0
- data/spec/rhc/commands/apps_spec.rb +39 -0
- data/spec/rhc/commands/authorization_spec.rb +157 -0
- data/spec/rhc/commands/cartridge_spec.rb +665 -0
- data/spec/rhc/commands/clone_spec.rb +41 -0
- data/spec/rhc/commands/deployment_spec.rb +327 -0
- data/spec/rhc/commands/domain_spec.rb +401 -0
- data/spec/rhc/commands/env_spec.rb +493 -0
- data/spec/rhc/commands/git_clone_spec.rb +102 -0
- data/spec/rhc/commands/logout_spec.rb +86 -0
- data/spec/rhc/commands/member_spec.rb +247 -0
- data/spec/rhc/commands/port_forward_spec.rb +217 -0
- data/spec/rhc/commands/scp_spec.rb +77 -0
- data/spec/rhc/commands/server_spec.rb +69 -0
- data/spec/rhc/commands/setup_spec.rb +118 -0
- data/spec/rhc/commands/snapshot_spec.rb +179 -0
- data/spec/rhc/commands/ssh_spec.rb +163 -0
- data/spec/rhc/commands/sshkey_spec.rb +188 -0
- data/spec/rhc/commands/tail_spec.rb +81 -0
- data/spec/rhc/commands/threaddump_spec.rb +84 -0
- data/spec/rhc/config_spec.rb +407 -0
- data/spec/rhc/helpers_spec.rb +531 -0
- data/spec/rhc/highline_extensions_spec.rb +314 -0
- data/spec/rhc/json_spec.rb +30 -0
- data/spec/rhc/rest_application_spec.rb +258 -0
- data/spec/rhc/rest_client_spec.rb +752 -0
- data/spec/rhc/rest_spec.rb +740 -0
- data/spec/rhc/targz_spec.rb +55 -0
- data/spec/rhc/wizard_spec.rb +756 -0
- data/spec/spec_helper.rb +575 -0
- data/spec/wizard_spec_helper.rb +330 -0
- metadata +469 -0
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'rhc/commands/git_clone'
|
2
|
+
|
3
|
+
module RHC::Commands
|
4
|
+
class Clone < GitClone
|
5
|
+
summary "Clone and configure an application's repository locally"
|
6
|
+
description "This is a convenience wrapper for 'git clone' with the added",
|
7
|
+
"benefit of adding configuration data such as the application's",
|
8
|
+
"UUID to the local repository. It also automatically",
|
9
|
+
"figures out the Git url from the application name so you don't",
|
10
|
+
"have to look it up."
|
11
|
+
syntax "<app> [--namespace NAME]"
|
12
|
+
takes_application :argument => true
|
13
|
+
option ["-r", "--repo dir"], "Path to the Git repository (defaults to ./$app_name)"
|
14
|
+
# alias_action 'app git-clone', :deprecated => true, :root_command => true
|
15
|
+
# TODO: Implement default values for arguments once ffranz has added context arguments
|
16
|
+
# argument :directory, "The name of a new directory to clone into", [], :default => nil
|
17
|
+
def run(app_name)
|
18
|
+
|
19
|
+
if url? app_name
|
20
|
+
if app = clonable_url?(app_name)
|
21
|
+
app_name = options.app = app[:name]
|
22
|
+
options.namespace = app[:domain]
|
23
|
+
else
|
24
|
+
warn "URL is invalid. To clone app your url must be something like this: http://appname-domain.startapp.bg/"
|
25
|
+
return 1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
super app_name
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def clonable_url?(app_name)
|
35
|
+
if startapp_url? app_name
|
36
|
+
app_name = clean_url(app_name)
|
37
|
+
app = extract_name_and_domain(app_name)
|
38
|
+
|
39
|
+
app
|
40
|
+
else
|
41
|
+
false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def url?(candidate)
|
46
|
+
!!(/http|\./.match(candidate))
|
47
|
+
end
|
48
|
+
|
49
|
+
def startapp_url?(candidate)
|
50
|
+
!!(/[a-zA-Z0-9]+-[a-zA-Z0-9]+\.startapp\./.match(candidate))
|
51
|
+
end
|
52
|
+
|
53
|
+
def clean_url(url)
|
54
|
+
url.dup.gsub!(/http(s?):\/\/|\//,'')
|
55
|
+
end
|
56
|
+
|
57
|
+
def extract_name_and_domain(url)
|
58
|
+
result = {}
|
59
|
+
name_and_domain = /([a-zA-Z0-9]+)-([a-zA-Z0-9]+)/.match(url)
|
60
|
+
result[:name], result[:domain] = name_and_domain[1], name_and_domain[2]
|
61
|
+
|
62
|
+
result
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rhc/commands/app'
|
2
|
+
|
3
|
+
module RHC::Commands
|
4
|
+
class Configure < App
|
5
|
+
summary "Configure several properties that apply to an application"
|
6
|
+
syntax "<app> [--[no-]auto-deploy] [--keep-deployments INTEGER] [--deployment-branch BRANCH] [--deployment-type TYPE] [--namespace NAME]"
|
7
|
+
takes_application :argument => true
|
8
|
+
option ["--[no-]auto-deploy"], "Build and deploy automatically when pushing to the git repo. Defaults to true."
|
9
|
+
option ["--keep-deployments INTEGER", Integer], "Number of deployments to preserve. Defaults to 1."
|
10
|
+
option ["--deployment-branch BRANCH"], "Which branch should trigger an automatic deployment, if automatic deployment is enabled with --auto-deploy. Defaults to master."
|
11
|
+
option ["--deployment-type git|binary"], "Type of deployment the application accepts ('git' or 'binary'). Defaults to git."
|
12
|
+
|
13
|
+
def run(app_name)
|
14
|
+
self.class.superclass.instance_method(:configure).bind(self).call app_name
|
15
|
+
|
16
|
+
0
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'rhc/commands/app'
|
2
|
+
require 'net/http'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module RHC::Commands
|
6
|
+
class Create < App
|
7
|
+
|
8
|
+
summary "Create an application"
|
9
|
+
description <<-DESC
|
10
|
+
Create an application. Every StartApp application must have one
|
11
|
+
web cartridge which serves web requests, and can have a number of
|
12
|
+
other cartridges which provide capabilities like databases,
|
13
|
+
scheduled jobs, or continuous integration.
|
14
|
+
|
15
|
+
You can see a list of all valid cartridge types by running
|
16
|
+
'app cartridge list'. StartApp also supports downloading cartridges -
|
17
|
+
pass a URL in place of the cartridge name and we'll download
|
18
|
+
and install that cartridge into your app. Keep in mind that
|
19
|
+
these cartridges receive no security updates. Note that not
|
20
|
+
all StartAPp servers allow downloaded cartridges.
|
21
|
+
|
22
|
+
When your application is created, a URL combining the name of
|
23
|
+
your app and the name of your domain will be registered in DNS.
|
24
|
+
A copy of the code for your application will be checked out locally
|
25
|
+
into a folder with the same name as your application. Note that
|
26
|
+
different types of applications may require different folder
|
27
|
+
structures - check the README provided with the cartridge if
|
28
|
+
you have questions.
|
29
|
+
|
30
|
+
StartApp runs the components of your application on small virtual
|
31
|
+
servers called "gears". Each account or plan is limited to a number
|
32
|
+
of gears which you can use across multiple applications. Some
|
33
|
+
accounts or plans provide access to gears with more memory or more
|
34
|
+
CPU. Run 'app account' to see the number and sizes of gears available
|
35
|
+
to you. When creating an application the --gear-size parameter
|
36
|
+
may be specified to change the gears used.
|
37
|
+
|
38
|
+
DESC
|
39
|
+
syntax "<name> <cartridge> [... <cartridge>] [... VARIABLE=VALUE] [-n namespace]"
|
40
|
+
option ["-n", "--namespace NAME"], "Namespace for the application"
|
41
|
+
option ["-g", "--gear-size SIZE"], "Gear size controls how much memory and CPU your cartridges can use."
|
42
|
+
option ["-s", "--scaling"], "Enable scaling for the web cartridge."
|
43
|
+
option ["-r", "--repo DIR"], "Path to the Git repository (defaults to ./$app_name)"
|
44
|
+
option ["-e", "--env VARIABLE=VALUE"], "Environment variable(s) to be set on this app, or path to a file containing environment variables", :type => :list
|
45
|
+
option ["--from-code URL"], "URL to a Git repository that will become the initial contents of the application"
|
46
|
+
option ["--[no-]git"], "Skip creating the local Git repository."
|
47
|
+
option ["--[no-]dns"], "Skip waiting for the application DNS name to resolve. Must be used in combination with --no-git"
|
48
|
+
option ['--no-keys'], "Skip checking SSH keys during app creation", :hide => true
|
49
|
+
option ["--enable-jenkins [NAME]"], "Enable Jenkins builds for this application (will create a Jenkins application if not already available). The default name will be 'jenkins' if not specified."
|
50
|
+
argument :name, "Name for your application", ["-a", "--app NAME"], :optional => true
|
51
|
+
argument :cartridges, "The web framework this application should use", ["-t", "--type CARTRIDGE"], :optional => true, :type => :list
|
52
|
+
|
53
|
+
def run(name, cartridges)
|
54
|
+
|
55
|
+
quickstarts = get_quickstarts
|
56
|
+
|
57
|
+
if quickstarts.include? cartridges.first
|
58
|
+
bundle = quickstarts[cartridges.first]
|
59
|
+
cartridges = bundle["cartridges"]
|
60
|
+
options.from_code = bundle["code"]
|
61
|
+
end
|
62
|
+
|
63
|
+
cartridges = helping_words_cleaner(cartridges)
|
64
|
+
self.class.superclass.instance_method(:create).bind(self).call name, cartridges
|
65
|
+
|
66
|
+
0
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def get_quickstarts
|
72
|
+
@response ||= Net::HTTP.get(URI.parse('http://install.startapp.bg/q/quickstarts.json'))
|
73
|
+
JSON.parse @response
|
74
|
+
end
|
75
|
+
|
76
|
+
def list_quickstarts(quickstarts)
|
77
|
+
quicks = quickstarts.map{ |q| ([q[0], q[1]['name'] || '' ] ) if q[1]['view_on_cli'] == "true" }.compact!.sort{ |a,b| a[1].downcase <=> b[1].downcase }
|
78
|
+
quicks.unshift ['==========', '=========']
|
79
|
+
quicks.unshift ['Quickstart', 'Full name']
|
80
|
+
say table(quicks)
|
81
|
+
end
|
82
|
+
|
83
|
+
def helping_words_cleaner(words_list)
|
84
|
+
words = ['with', 'and']
|
85
|
+
words.each do |word|
|
86
|
+
words_list.delete word
|
87
|
+
end
|
88
|
+
words_list
|
89
|
+
end
|
90
|
+
|
91
|
+
def check_name!(name)
|
92
|
+
return unless name.blank?
|
93
|
+
|
94
|
+
paragraph{ say "You can choose some of ours quickstarts. Just write `app create myapp quickstart`" }
|
95
|
+
paragraph{ list_quickstarts(get_quickstarts) }
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rhc/commands/app'
|
2
|
+
|
3
|
+
module RHC::Commands
|
4
|
+
class Delete < App
|
5
|
+
summary "Delete an application from the server"
|
6
|
+
description "Deletes your application and all of its data from the server.",
|
7
|
+
"Use with caution as this operation is permanent."
|
8
|
+
syntax "<app> [--namespace NAME]"
|
9
|
+
takes_application :argument => true
|
10
|
+
option ["--confirm"], "Pass to confirm deleting the application"
|
11
|
+
|
12
|
+
def run(app)
|
13
|
+
self.class.superclass.instance_method(:delete).bind(self).call app
|
14
|
+
|
15
|
+
0
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rhc/commands/app'
|
2
|
+
|
3
|
+
module RHC::Commands
|
4
|
+
class Deploy < App
|
5
|
+
|
6
|
+
summary "Deploy a git reference or binary file of an application"
|
7
|
+
syntax "<ref> --app NAME [--namespace NAME]"
|
8
|
+
description <<-DESC
|
9
|
+
By default OpenShift applications prepare, distribute, and activate deployments
|
10
|
+
on every git push. Alternatively, a user may choose to disable automatic
|
11
|
+
deployments and use 'rhc deploy' and 'rhc deployment' commands to fully control the
|
12
|
+
deployment lifecycle.
|
13
|
+
|
14
|
+
Use this command to prepare, distribute and deploy manually from a git reference
|
15
|
+
(commit id, tag or branch) or from a binary file. Check also 'rhc configure-app'
|
16
|
+
to configure your application to deploy manually and set the number of deployments
|
17
|
+
to keep in history.
|
18
|
+
|
19
|
+
DESC
|
20
|
+
takes_application
|
21
|
+
argument :ref, "Git tag, branch or commit id or path to binary file to be deployed", ["--ref REF"], :optional => false
|
22
|
+
option "--[no-]hot-deploy", "Perform hot deployment according to the specified argument rather than checking for the presence of the hot_deploy marker in the application git repo"
|
23
|
+
option "--[no-]force-clean-build", "Perform a clean build according to the specified argument rather than checking for the presence of the force_clean_build marker in the application git repo"
|
24
|
+
|
25
|
+
def run(ref)
|
26
|
+
self.class.superclass.instance_method(:delete).bind(self).call ref
|
27
|
+
|
28
|
+
0
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'rhc/commands/base'
|
2
|
+
require 'rhc/deployment_helpers'
|
3
|
+
|
4
|
+
module RHC::Commands
|
5
|
+
class Deployment < Base
|
6
|
+
include RHC::DeploymentHelpers
|
7
|
+
|
8
|
+
summary "Commands for deploying and managing deployments of an application"
|
9
|
+
description <<-DESC
|
10
|
+
By default OpenShift applications prepare, distribute, and activate deployments
|
11
|
+
on every git push. Alternatively, a user may choose to disable automatic
|
12
|
+
deployments and use this 'rhc deployment' set of commands to fully control the
|
13
|
+
deployment lifecycle. Use these commands to deploy manually from a git reference
|
14
|
+
or from a binary file, list and display deployments and also activate existing
|
15
|
+
deployments. Check also 'rhc configure-app' to configure your application to
|
16
|
+
deploy manually.
|
17
|
+
|
18
|
+
DESC
|
19
|
+
syntax "<action>"
|
20
|
+
default_action :help
|
21
|
+
|
22
|
+
summary "List the existing deployments of an application"
|
23
|
+
description <<-DESC
|
24
|
+
List all existing deployments of a given application. Check the 'rhc configure-app'
|
25
|
+
command to configure how many deployments are preserved in history.
|
26
|
+
|
27
|
+
DESC
|
28
|
+
syntax "<application>"
|
29
|
+
takes_application :argument => true
|
30
|
+
alias_action :"deployments", :root_command => true
|
31
|
+
def list(app)
|
32
|
+
rest_app = find_app
|
33
|
+
deployment_activations = rest_app.deployment_activations
|
34
|
+
|
35
|
+
raise RHC::DeploymentNotFoundException, "No deployments found for application #{app}." if !deployment_activations.present?
|
36
|
+
|
37
|
+
pager
|
38
|
+
|
39
|
+
display_deployment_list(deployment_activations)
|
40
|
+
0
|
41
|
+
end
|
42
|
+
|
43
|
+
summary "Show details of the given deployment"
|
44
|
+
syntax "<deployment_id> --app NAME [--namespace NAME]"
|
45
|
+
description <<-DESC
|
46
|
+
Display details of the given deployment id.
|
47
|
+
|
48
|
+
DESC
|
49
|
+
takes_application
|
50
|
+
argument :id, "The deployment ID to show", ["--id ID"], :optional => false
|
51
|
+
def show(id)
|
52
|
+
rest_app = find_app
|
53
|
+
item = rest_app.deployment_activations.reverse_each.detect{|item| item[:deployment].id == id}
|
54
|
+
|
55
|
+
raise RHC::DeploymentNotFoundException, "Deployment ID '#{id}' not found for application #{rest_app.name}." if !item.present?
|
56
|
+
|
57
|
+
display_deployment(item)
|
58
|
+
paragraph { say "Use 'rhc show-app #{rest_app.name} --configuration' to check your deployment configurations." }
|
59
|
+
0
|
60
|
+
end
|
61
|
+
|
62
|
+
summary "Activate an existing deployment"
|
63
|
+
description <<-DESC
|
64
|
+
Switch between existing deployments. This command allows you to rollback from one
|
65
|
+
deployment to a previous one or activate subsequent deployments. Check the 'rhc
|
66
|
+
configure-app' command to configure how many deployments are preserved in history.
|
67
|
+
|
68
|
+
DESC
|
69
|
+
syntax "<deployment_id> --app NAME [--namespace NAME]"
|
70
|
+
takes_application
|
71
|
+
argument :id, "The deployment ID to activate on the application", ["--id ID"], :optional => false
|
72
|
+
def activate(id)
|
73
|
+
rest_app = find_app
|
74
|
+
|
75
|
+
raise RHC::DeploymentsNotSupportedException.new if !rest_app.supports? "DEPLOY"
|
76
|
+
|
77
|
+
activate_deployment(rest_app, id)
|
78
|
+
0
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
require 'rhc/commands/base'
|
2
|
+
|
3
|
+
module RHC::Commands
|
4
|
+
class Domain < Base
|
5
|
+
summary "Add or rename the container for your apps"
|
6
|
+
syntax "<action>"
|
7
|
+
description <<-DESC
|
8
|
+
All StartApp applications must belong to a domain. The name of the domain
|
9
|
+
will be used as part of the public URL for an application.
|
10
|
+
|
11
|
+
For example, when creating a domain with the name "test", any applications
|
12
|
+
created in that domain will have the public URL:
|
13
|
+
|
14
|
+
http://<appname>-test.startapp.bg
|
15
|
+
|
16
|
+
Each account may have access to one or more domains shared by others. Depending
|
17
|
+
on your plan or configuration, you may be able to create more than one domain.
|
18
|
+
|
19
|
+
To create your first domain, run 'app setup' or 'app create-domain'.
|
20
|
+
DESC
|
21
|
+
default_action :help
|
22
|
+
|
23
|
+
summary "Create a new container for applications."
|
24
|
+
syntax "<namespace>"
|
25
|
+
description <<-DESC
|
26
|
+
A domain is a container for your applications. Each account may have one
|
27
|
+
or more domains (depending on plan), and you may collaborate on applications
|
28
|
+
by adding members to your domain.
|
29
|
+
|
30
|
+
The name of the domain is called its "namespace", and becomes part of the
|
31
|
+
application public URLs. For example, when creating a domain with the name "test",
|
32
|
+
all applications in that domain will have the public URL:
|
33
|
+
|
34
|
+
http://<appname>-test.startapp.bg
|
35
|
+
|
36
|
+
The domain owner may limit the gear sizes available to applications by using the
|
37
|
+
'--allowed-gear-sizes' option. If '--no-allowed-gear-sizes' is set, no applications
|
38
|
+
can be created in the domain. Older servers may not support this option.
|
39
|
+
DESC
|
40
|
+
option ['--no-allowed-gear-sizes'], 'Do not allow any gear sizes in this domain.', :optional => true
|
41
|
+
option ['--allowed-gear-sizes [SIZES]'], 'A comma-delimited list of the gear sizes that will be allowed in this domain.', :optional => true
|
42
|
+
argument :namespace, "New domain name (letters and numbers, max 16 chars)", ["-n", "--namespace NAME"]
|
43
|
+
def create(namespace)
|
44
|
+
say "Creating domain '#{namespace}' ... "
|
45
|
+
rest_client.add_domain(namespace, :allowed_gear_sizes => check_allowed_gear_sizes)
|
46
|
+
success "done"
|
47
|
+
|
48
|
+
info "You may now create an application using the 'app create-app' command"
|
49
|
+
|
50
|
+
0
|
51
|
+
end
|
52
|
+
|
53
|
+
summary "Rename a domain (will change application urls)"
|
54
|
+
syntax "<old name> <new name>"
|
55
|
+
argument :old_namespace, "Existing domain name", []
|
56
|
+
argument :new_namespace, "New domain name (letters and numbers, max 16 chars)", ["-n", "--namespace NAME"]
|
57
|
+
alias_action :update, :deprecated => true
|
58
|
+
def rename(old_namespace, new_namespace)
|
59
|
+
domain = rest_client.find_domain(old_namespace)
|
60
|
+
|
61
|
+
say "Renaming domain '#{domain.name}' to '#{new_namespace}' ... "
|
62
|
+
domain.rename(new_namespace)
|
63
|
+
success "done"
|
64
|
+
|
65
|
+
info "Applications in this domain will use the new name in their URL."
|
66
|
+
|
67
|
+
0
|
68
|
+
end
|
69
|
+
|
70
|
+
summary "Change one or more configuration settings on the domain"
|
71
|
+
syntax "<namespace>"
|
72
|
+
option ['--no-allowed-gear-sizes'], 'Do not allow any gear sizes in this domain.', :optional => true
|
73
|
+
option ['--allowed-gear-sizes [SIZES]'], "A comma-delimited list of gear sizes allowed in this domain. To see available sizes, run 'app account'.", :optional => true
|
74
|
+
takes_domain :argument => true
|
75
|
+
def configure(_)
|
76
|
+
domain = find_domain
|
77
|
+
payload = {}
|
78
|
+
payload[:allowed_gear_sizes] = check_allowed_gear_sizes unless options.allowed_gear_sizes.nil? and options.no_allowed_gear_sizes.nil?
|
79
|
+
|
80
|
+
if payload.present?
|
81
|
+
say "Updating domain configuration ... "
|
82
|
+
domain.configure(payload)
|
83
|
+
success "done"
|
84
|
+
end
|
85
|
+
|
86
|
+
paragraph do
|
87
|
+
say format_table("Domain #{domain.name} configuration", get_properties(domain, :allowed_gear_sizes), :delete => true)
|
88
|
+
end
|
89
|
+
|
90
|
+
0
|
91
|
+
end
|
92
|
+
|
93
|
+
summary "Display a domain and its applications"
|
94
|
+
takes_domain :argument => true
|
95
|
+
def show(_)
|
96
|
+
domain = find_domain
|
97
|
+
|
98
|
+
warn "In order to deploy applications, you must create a domain with 'app setup' or 'app create-domain'." and return 1 unless domain
|
99
|
+
|
100
|
+
applications = domain.applications(:include => :cartridges)
|
101
|
+
display_domain(domain, applications, true)
|
102
|
+
|
103
|
+
if applications.present?
|
104
|
+
success "You have #{pluralize(applications.length, 'application')} in your domain."
|
105
|
+
else
|
106
|
+
success "The domain #{domain.name} exists but has no applications. You can use 'app create-app' to create a new application."
|
107
|
+
end
|
108
|
+
|
109
|
+
0
|
110
|
+
end
|
111
|
+
|
112
|
+
summary "Display all domains you have access to"
|
113
|
+
option ['--mine'], "Display only domains you own"
|
114
|
+
option ['--ids'], "Display the unique id of the domain (deprecated, domain IDs are now displayed by default)"
|
115
|
+
alias_action :domains, :root_command => true
|
116
|
+
def list
|
117
|
+
domains = rest_client.send(options.mine ? :owned_domains : :domains)
|
118
|
+
|
119
|
+
warn "In order to deploy applications, you must create a domain with 'app setup' or 'app create-domain'." and return 1 unless domains.present?
|
120
|
+
warn "The --ids option is deprecated. Domain IDs are displayed by default." if options.ids
|
121
|
+
|
122
|
+
domains.each do |d|
|
123
|
+
display_domain(d, nil, true)
|
124
|
+
end
|
125
|
+
|
126
|
+
success "You have access to #{pluralize(domains.length, 'domain')}."
|
127
|
+
|
128
|
+
0
|
129
|
+
end
|
130
|
+
|
131
|
+
summary "Delete a domain"
|
132
|
+
syntax "<namespace>"
|
133
|
+
takes_domain :argument => true
|
134
|
+
option ["-f", "--force"], "Force the action"
|
135
|
+
def delete(_)
|
136
|
+
domain = find_domain
|
137
|
+
|
138
|
+
say "Deleting domain '#{domain.name}' ... "
|
139
|
+
domain.destroy(options.force.present?)
|
140
|
+
success "deleted"
|
141
|
+
|
142
|
+
0
|
143
|
+
end
|
144
|
+
|
145
|
+
summary "Leave a domain (remove your membership)"
|
146
|
+
syntax "<namespace>"
|
147
|
+
argument :namespace, "Name of the domain", ["-n", "--namespace NAME"]
|
148
|
+
def leave(namespace)
|
149
|
+
domain = rest_client.find_domain(namespace)
|
150
|
+
|
151
|
+
say "Leaving domain ... "
|
152
|
+
domain.leave
|
153
|
+
success "done"
|
154
|
+
|
155
|
+
0
|
156
|
+
end
|
157
|
+
|
158
|
+
protected
|
159
|
+
def check_allowed_gear_sizes
|
160
|
+
raise OptionParser::InvalidOption, "--allowed-gear-sizes and --no-allowed-gear-sizes cannot both be specified" unless options.allowed_gear_sizes.nil? or options.no_allowed_gear_sizes.nil?
|
161
|
+
sizes = options.no_allowed_gear_sizes.nil? ? options.allowed_gear_sizes : false
|
162
|
+
raise OptionParser::InvalidOption, "The server does not support --allowed-gear-sizes" unless sizes.nil? || rest_client.api.has_param?(:add_domain, 'allowed_gear_sizes')
|
163
|
+
if sizes.is_a? String
|
164
|
+
sizes.split(',').map(&:strip).map(&:presence)
|
165
|
+
elsif sizes == false
|
166
|
+
[]
|
167
|
+
elsif sizes
|
168
|
+
raise OptionParser::InvalidOption, "Provide a comma delimited list of valid gear sizes to --allowed-gear-sizes"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'rhc/commands/base'
|
2
|
+
|
3
|
+
module RHC::Commands
|
4
|
+
class Env < Base
|
5
|
+
summary "Manages user-defined environment variables set on a given application"
|
6
|
+
syntax "<action>"
|
7
|
+
description <<-DESC
|
8
|
+
Manages the user-defined environment variables set on a given
|
9
|
+
application. To see a list of all environment variables use the command
|
10
|
+
'rhc list-env <application>'. Note that some predefined
|
11
|
+
cartridge-level environment variables can also be overriden,
|
12
|
+
but most variables provided by gears are read-only.
|
13
|
+
|
14
|
+
Type 'rhc set-env --help' for more details.
|
15
|
+
|
16
|
+
DESC
|
17
|
+
default_action :help
|
18
|
+
alias_action :"app env", :root_command => true
|
19
|
+
|
20
|
+
summary "Set one or more environment variable(s) to your application"
|
21
|
+
description <<-DESC
|
22
|
+
Set one or more environment variable(s) to your application.
|
23
|
+
Operands of the form 'VARIABLE=VALUE' set the environment
|
24
|
+
variable VARIABLE to value VALUE. Example:
|
25
|
+
|
26
|
+
rhc set-env VARIABLE1=VALUE1 VARIABLE2=VALUE2 -a myapp
|
27
|
+
|
28
|
+
Environment variables can also be set from a file containing one
|
29
|
+
or more VARIABLE=VALUE pairs (one per line). Example:
|
30
|
+
|
31
|
+
rhc set-env /path/to/file -a myapp
|
32
|
+
|
33
|
+
VALUE may be empty, in that case 'VARIABLE='. Setting a
|
34
|
+
variable to an empty value is different from unsetting it.
|
35
|
+
|
36
|
+
Some default cartridge-level variables can be overriden, but
|
37
|
+
variables provided by gears are read-only.
|
38
|
+
|
39
|
+
DESC
|
40
|
+
syntax "<VARIABLE=VALUE> [... <VARIABLE=VALUE>] [--namespace NAME] [--app NAME]"
|
41
|
+
argument :env, "Environment variable name and value pair separated by an equal (=) sign, e.g. VARIABLE=VALUE", ["-e", "--env VARIABLE=VALUE"], :optional => false, :type => :list
|
42
|
+
takes_application
|
43
|
+
option ["--confirm"], "Pass to confirm setting the environment variable(s)"
|
44
|
+
alias_action :add
|
45
|
+
def set(env)
|
46
|
+
rest_app = find_app
|
47
|
+
|
48
|
+
with_file = env.index {|item| File.file? item}
|
49
|
+
|
50
|
+
env_vars = []
|
51
|
+
env.each {|item| env_vars.concat(collect_env_vars(item))}
|
52
|
+
raise RHC::EnvironmentVariableNotProvidedException.new(
|
53
|
+
(with_file ?
|
54
|
+
"Environment variable(s) not found in the provided file(s).\n" :
|
55
|
+
"Environment variable(s) not provided.\n") <<
|
56
|
+
"Please provide at least one environment variable using the syntax VARIABLE=VALUE. VARIABLE can only contain letters, digits and underscore ('_') and can't begin with a digit.") if env_vars.empty?
|
57
|
+
|
58
|
+
if with_file
|
59
|
+
env_vars.each {|item| default_display_env_var(item.name, item.value)}
|
60
|
+
confirm_action "Do you want to set these environment variables on '#{rest_app.name}?"
|
61
|
+
end
|
62
|
+
|
63
|
+
say 'Setting environment variable(s) ... '
|
64
|
+
rest_app.set_environment_variables(env_vars)
|
65
|
+
success 'done'
|
66
|
+
|
67
|
+
0
|
68
|
+
end
|
69
|
+
|
70
|
+
summary "Remove one or more environment variable(s) currently set to your application"
|
71
|
+
description <<-DESC
|
72
|
+
Remove one or more environment variable(s) currently set to your
|
73
|
+
application. Setting a variable to an empty value is
|
74
|
+
different from unsetting it. When unsetting a default cartridge-
|
75
|
+
level variable previously overriden, the variable will be set
|
76
|
+
back to its default value.
|
77
|
+
|
78
|
+
DESC
|
79
|
+
syntax "<VARIABLE> [... <VARIABLE>] [--namespace NAME] [--app NAME]"
|
80
|
+
argument :env, "Name of the environment variable(s), e.g. VARIABLE", ["-e", "--env VARIABLE"], :optional => false, :type => :list
|
81
|
+
takes_application
|
82
|
+
option ["--confirm"], "Pass to confirm removing the environment variable"
|
83
|
+
alias_action :remove
|
84
|
+
def unset(env)
|
85
|
+
rest_app = find_app
|
86
|
+
|
87
|
+
warn 'Removing environment variables is a destructive operation that may result in loss of data.'
|
88
|
+
|
89
|
+
env.each do |e|
|
90
|
+
default_display_env_var(e)
|
91
|
+
end
|
92
|
+
|
93
|
+
confirm_action "Are you sure you wish to remove the environment variable(s) above from application '#{rest_app.name}'?"
|
94
|
+
say 'Removing environment variable(s) ... '
|
95
|
+
rest_app.unset_environment_variables(env)
|
96
|
+
success 'removed'
|
97
|
+
|
98
|
+
0
|
99
|
+
end
|
100
|
+
|
101
|
+
summary "List all environment variables set on the application"
|
102
|
+
description <<-DESC
|
103
|
+
List all user-defined environment variables set on the application.
|
104
|
+
Gear-level variables overriden by the 'rhc set-env' command
|
105
|
+
will also be listed.
|
106
|
+
|
107
|
+
DESC
|
108
|
+
syntax "<app> [--namespace NAME]"
|
109
|
+
takes_application :argument => true
|
110
|
+
option ["--table"], "Format the output list as a table"
|
111
|
+
option ["--quotes"], "Format the output list with double quotes for env var values"
|
112
|
+
def list(app)
|
113
|
+
rest_app = find_app
|
114
|
+
rest_env_vars = rest_app.environment_variables
|
115
|
+
|
116
|
+
pager
|
117
|
+
|
118
|
+
display_env_var_list(rest_env_vars, { :table => options.table, :quotes => options.quotes })
|
119
|
+
|
120
|
+
0
|
121
|
+
end
|
122
|
+
|
123
|
+
summary "Show the value of one or more environment variable(s) currently set to your application"
|
124
|
+
syntax "<VARIABLE> [... <VARIABLE>] [--namespace NAME] [--app NAME]"
|
125
|
+
argument :env, "Name of the environment variable(s), e.g. VARIABLE", ["-e", "--env VARIABLE"], :optional => false, :type => :list
|
126
|
+
takes_application
|
127
|
+
option ["--table"], "Format the output list as a table"
|
128
|
+
option ["--quotes"], "Format the output list with double quotes for env var values"
|
129
|
+
def show(env)
|
130
|
+
rest_app = find_app
|
131
|
+
rest_env_vars = rest_app.find_environment_variables(env)
|
132
|
+
|
133
|
+
pager
|
134
|
+
|
135
|
+
display_env_var_list(rest_env_vars, { :table => options.table, :quotes => options.quotes })
|
136
|
+
|
137
|
+
0
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rhc/commands/app'
|
2
|
+
|
3
|
+
module RHC::Commands
|
4
|
+
class ForceStop < App
|
5
|
+
|
6
|
+
summary "Stops all application processes"
|
7
|
+
syntax "<app> [--namespace NAME]"
|
8
|
+
takes_application :argument => true
|
9
|
+
|
10
|
+
def run(app)
|
11
|
+
self.class.superclass.instance_method(:force_stop).bind(self).call app
|
12
|
+
|
13
|
+
0
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|