ufo 3.5.7 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +24 -0
- data/Gemfile.lock +16 -10
- data/README.md +12 -13
- data/docs/_config.yml +1 -1
- data/docs/_docs/auto-completion.md +4 -4
- data/docs/_docs/automated-cleanup.md +1 -1
- data/docs/_docs/conventions.md +7 -7
- data/docs/_docs/customize-cloudformation.md +36 -0
- data/docs/_docs/faq.md +9 -7
- data/docs/_docs/fargate.md +102 -0
- data/docs/_docs/helpers.md +3 -3
- data/docs/_docs/load-balancer.md +72 -0
- data/docs/_docs/migrations.md +2 -2
- data/docs/_docs/next-steps.md +2 -2
- data/docs/_docs/params.md +12 -41
- data/docs/_docs/route53-support.md +28 -0
- data/docs/_docs/run-in-pieces.md +2 -2
- data/docs/_docs/security-groups.md +54 -0
- data/docs/_docs/settings-cfn.md +11 -0
- data/docs/_docs/settings-network.md +34 -0
- data/docs/_docs/settings.md +18 -15
- data/docs/_docs/single-task.md +3 -3
- data/docs/_docs/ssl-support.md +42 -0
- data/docs/_docs/structure.md +5 -1
- data/docs/_docs/stuck-cloudformation.md +30 -0
- data/docs/_docs/tutorial-ufo-docker-build.md +19 -31
- data/docs/_docs/tutorial-ufo-init.md +16 -12
- data/docs/_docs/tutorial-ufo-ship.md +50 -54
- data/docs/_docs/tutorial-ufo-ships.md +9 -7
- data/docs/_docs/tutorial-ufo-tasks-build.md +26 -17
- data/docs/_docs/ufo-current.md +50 -0
- data/docs/_docs/ufo-env-extra.md +21 -0
- data/docs/_docs/ufo-env.md +6 -13
- data/docs/_docs/ufo-tasks-register.md +3 -3
- data/docs/_docs/upgrade4.md +49 -0
- data/docs/_docs/variables.md +5 -5
- data/docs/_docs/why-cloudformation.md +22 -0
- data/docs/_includes/about.html +1 -1
- data/docs/_includes/cfn-customize.md +39 -0
- data/docs/_includes/commands.html +6 -6
- data/docs/_includes/css/ufo.css +1 -0
- data/docs/_includes/example.html +13 -13
- data/docs/_includes/reference.md +1 -1
- data/docs/_includes/subnav.html +22 -5
- data/docs/_includes/ufo-ship-options.md +7 -6
- data/docs/_reference/ufo-apps.md +36 -0
- data/docs/_reference/ufo-cancel.md +24 -0
- data/docs/_reference/ufo-completion.md +1 -1
- data/docs/_reference/ufo-completion_script.md +1 -1
- data/docs/_reference/ufo-current.md +93 -0
- data/docs/_reference/ufo-deploy.md +18 -17
- data/docs/_reference/ufo-destroy.md +6 -4
- data/docs/_reference/ufo-docker-base.md +7 -7
- data/docs/_reference/ufo-docker-build.md +9 -9
- data/docs/_reference/ufo-docker-clean.md +8 -8
- data/docs/_reference/ufo-docker-name.md +4 -4
- data/docs/_reference/ufo-docker.md +4 -2
- data/docs/_reference/ufo-init.md +31 -20
- data/docs/_reference/ufo-network-help.md +15 -0
- data/docs/_reference/ufo-network-init.md +38 -0
- data/docs/_reference/ufo-network.md +26 -0
- data/docs/_reference/ufo-ps.md +53 -0
- data/docs/_reference/ufo-releases.md +40 -0
- data/docs/_reference/ufo-resources.md +44 -0
- data/docs/_reference/ufo-rollback.md +59 -0
- data/docs/_reference/ufo-scale.md +23 -3
- data/docs/_reference/ufo-ship.md +54 -27
- data/docs/_reference/ufo-ships.md +17 -26
- data/docs/_reference/ufo-stop.md +31 -0
- data/docs/_reference/ufo-task.md +15 -16
- data/docs/_reference/ufo-tasks-build.md +10 -10
- data/docs/_reference/ufo-tasks-register.md +3 -3
- data/docs/_reference/ufo-tasks.md +1 -1
- data/docs/_reference/ufo-upgrade-help.md +15 -0
- data/docs/_reference/ufo-upgrade-v2to3.md +15 -0
- data/docs/_reference/ufo-upgrade-v3_3to3_4.md +15 -0
- data/docs/_reference/ufo-upgrade-v3to4.md +27 -0
- data/docs/_reference/ufo-upgrade.md +28 -0
- data/docs/_reference/ufo-version.md +1 -1
- data/docs/articles.md +2 -2
- data/docs/docs.md +1 -1
- data/docs/img/docs/cloudformation-resources.png +0 -0
- data/docs/img/tutorials/ecs-console-task-definitions.png +0 -0
- data/docs/img/tutorials/ecs-console-ufo-ship.png +0 -0
- data/docs/img/tutorials/ecs-console-ufo-ships.png +0 -0
- data/docs/quick-start.md +21 -9
- data/docs/reference.md +10 -2
- data/exe/ufo +1 -1
- data/lib/cfn/stack.yml +259 -0
- data/lib/template/.ufo/params.yml.tt +21 -60
- data/lib/template/.ufo/settings.yml.tt +6 -1
- data/lib/template/.ufo/settings/cfn/default.yml.tt +55 -0
- data/lib/template/.ufo/settings/network/default.yml.tt +18 -0
- data/lib/template/.ufo/task_definitions.rb.tt +7 -6
- data/lib/template/.ufo/templates/fargate.json.erb +1 -1
- data/lib/template/.ufo/templates/main.json.erb +1 -0
- data/lib/template/.ufo/variables/base.rb.tt +5 -2
- data/lib/template/Dockerfile +10 -15
- data/lib/template/bin/deploy.tt +2 -2
- data/lib/ufo.rb +29 -20
- data/lib/ufo/apps.rb +49 -0
- data/lib/ufo/apps/cfn_map.rb +70 -0
- data/lib/ufo/apps/service.rb +56 -0
- data/lib/ufo/aws_service.rb +15 -6
- data/lib/ufo/base.rb +32 -0
- data/lib/ufo/cancel.rb +23 -0
- data/lib/ufo/cli.rb +91 -27
- data/lib/ufo/core.rb +35 -3
- data/lib/ufo/current.rb +104 -0
- data/lib/ufo/destroy.rb +10 -41
- data/lib/ufo/docker/builder.rb +5 -4
- data/lib/ufo/docker/cleaner.rb +1 -1
- data/lib/ufo/docker/pusher.rb +2 -2
- data/lib/ufo/ecr/cleaner.rb +1 -1
- data/lib/ufo/help/apps.md +12 -0
- data/lib/ufo/help/balancer.md +3 -0
- data/lib/ufo/help/current.md +65 -0
- data/lib/ufo/help/deploy.md +4 -4
- data/lib/ufo/help/destroy.md +3 -3
- data/lib/ufo/help/docker.md +3 -1
- data/lib/ufo/help/docker/base.md +7 -7
- data/lib/ufo/help/docker/build.md +9 -9
- data/lib/ufo/help/docker/clean.md +8 -8
- data/lib/ufo/help/docker/name.md +4 -4
- data/lib/ufo/help/help.md +5 -0
- data/lib/ufo/help/init.md +24 -16
- data/lib/ufo/help/network/init.md +13 -0
- data/lib/ufo/help/ps.md +27 -0
- data/lib/ufo/help/releases.md +16 -0
- data/lib/ufo/help/resources.md +20 -0
- data/lib/ufo/help/rollback.md +35 -0
- data/lib/ufo/help/scale.md +22 -2
- data/lib/ufo/help/ship.md +40 -14
- data/lib/ufo/help/ships.md +4 -13
- data/lib/ufo/help/stop.md +7 -0
- data/lib/ufo/help/task.md +9 -9
- data/lib/ufo/help/tasks/build.md +10 -10
- data/lib/ufo/help/tasks/register.md +3 -3
- data/lib/ufo/help/upgrade/v3to4.md +3 -0
- data/lib/ufo/info.rb +62 -0
- data/lib/ufo/init.rb +36 -23
- data/lib/ufo/log_group.rb +2 -1
- data/lib/ufo/network.rb +24 -0
- data/lib/ufo/network/fetch.rb +41 -0
- data/lib/ufo/network/helper.rb +23 -0
- data/lib/ufo/network/init.rb +26 -0
- data/lib/ufo/param.rb +5 -5
- data/lib/ufo/ps.rb +102 -0
- data/lib/ufo/ps/task.rb +78 -0
- data/lib/ufo/releases.rb +14 -0
- data/lib/ufo/rollback.rb +53 -0
- data/lib/ufo/scale.rb +6 -12
- data/lib/ufo/sequence.rb +7 -0
- data/lib/ufo/setting.rb +7 -6
- data/lib/ufo/setting/profile.rb +24 -0
- data/lib/ufo/ship.rb +35 -326
- data/lib/ufo/stack.rb +203 -0
- data/lib/ufo/stack/context.rb +242 -0
- data/lib/ufo/stack/helper.rb +28 -0
- data/lib/ufo/stack/status.rb +195 -0
- data/lib/ufo/stop.rb +47 -0
- data/lib/ufo/task.rb +96 -15
- data/lib/ufo/tasks/register.rb +1 -1
- data/lib/ufo/template_scope.rb +81 -7
- data/lib/ufo/upgrade.rb +32 -0
- data/lib/ufo/{upgrade3.rb → upgrade/upgrade3.rb} +1 -1
- data/lib/ufo/{upgrade33_to_34.rb → upgrade/upgrade33to34.rb} +2 -2
- data/lib/ufo/upgrade/upgrade4.rb +161 -0
- data/lib/ufo/util.rb +19 -6
- data/lib/ufo/version.rb +1 -1
- data/spec/fixtures/apps/describe_services.json +96 -0
- data/spec/fixtures/cfn/stack-events-complete.json +1080 -0
- data/spec/fixtures/cfn/stack-events-in-progress.json +1080 -0
- data/spec/fixtures/cfn/stack-events-update-rollback-complete.json +1086 -0
- data/spec/fixtures/deployments.json +50 -0
- data/spec/fixtures/ps/describe_tasks.json +58 -0
- data/spec/fixtures/settings.yml +2 -0
- data/spec/lib/apps_spec.rb +20 -0
- data/spec/lib/cli_spec.rb +4 -4
- data/spec/lib/ps_spec.rb +14 -0
- data/spec/lib/setting_spec.rb +2 -1
- data/spec/lib/ship_spec.rb +6 -30
- data/spec/lib/stack/status_spec.rb +76 -0
- data/spec/lib/stop_spec.rb +13 -0
- data/spec/lib/task_spec.rb +5 -2
- data/spec/spec_helper.rb +1 -1
- data/ufo.gemspec +2 -0
- metadata +120 -6
- data/docs/_reference/ufo-upgrade3.md +0 -23
- data/docs/_reference/ufo-upgrade3_3_to_3_4.md +0 -23
@@ -0,0 +1,56 @@
|
|
1
|
+
class Ufo::Apps
|
2
|
+
class Service
|
3
|
+
extend Memoist
|
4
|
+
|
5
|
+
def initialize(service, options)
|
6
|
+
@service = service
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_a
|
11
|
+
[name, task_definition, running, launch_type, ufo?]
|
12
|
+
end
|
13
|
+
|
14
|
+
def task_definition
|
15
|
+
@service["task_definition"].split('/').last
|
16
|
+
end
|
17
|
+
|
18
|
+
def launch_type
|
19
|
+
@service["launch_type"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def cfn_map
|
23
|
+
@cfn_map ||= CfnMap.new(@options).map
|
24
|
+
end
|
25
|
+
|
26
|
+
def ufo?
|
27
|
+
yes = !!cfn_map[@service["service_name"]]
|
28
|
+
yes ? "yes" : "no"
|
29
|
+
end
|
30
|
+
|
31
|
+
def name
|
32
|
+
pretty_service_name = @service["service_name"]
|
33
|
+
pretty_name = cfn_map[pretty_service_name]
|
34
|
+
if pretty_name
|
35
|
+
"#{pretty_service_name} (#{pretty_name})"
|
36
|
+
else
|
37
|
+
pretty_service_name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def running
|
42
|
+
@service["running_count"]
|
43
|
+
end
|
44
|
+
|
45
|
+
def dns
|
46
|
+
return 'dns' if ENV['TEST']
|
47
|
+
elb = info.load_balancer(@service)
|
48
|
+
elb.dns_name if elb
|
49
|
+
end
|
50
|
+
|
51
|
+
def info
|
52
|
+
Ufo::Info.new(@service)
|
53
|
+
end
|
54
|
+
memoize :info
|
55
|
+
end
|
56
|
+
end
|
data/lib/ufo/aws_service.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "aws-sdk-cloudformation"
|
1
2
|
require "aws-sdk-cloudwatchlogs"
|
2
3
|
require "aws-sdk-ec2"
|
3
4
|
require "aws-sdk-ecr"
|
@@ -6,20 +7,28 @@ require "aws-sdk-elasticloadbalancingv2"
|
|
6
7
|
|
7
8
|
module Ufo
|
8
9
|
module AwsService
|
9
|
-
def
|
10
|
-
@
|
10
|
+
def cloudformation
|
11
|
+
@cloudformation ||= Aws::CloudFormation::Client.new
|
11
12
|
end
|
12
13
|
|
13
|
-
def
|
14
|
-
@
|
14
|
+
def cloudwatchlogs
|
15
|
+
@cloudwatchlogs ||= Aws::CloudWatchLogs::Client.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def ec2
|
19
|
+
@ec2 ||= Aws::EC2::Client.new
|
15
20
|
end
|
16
21
|
|
17
22
|
def ecr
|
18
23
|
@ecr ||= Aws::ECR::Client.new
|
19
24
|
end
|
20
25
|
|
21
|
-
def
|
22
|
-
@
|
26
|
+
def ecs
|
27
|
+
@ecs ||= Aws::ECS::Client.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def elb
|
31
|
+
@elb ||= Aws::ElasticLoadBalancingV2::Client.new
|
23
32
|
end
|
24
33
|
end
|
25
34
|
end
|
data/lib/ufo/base.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
module Ufo
|
2
|
+
class Base
|
3
|
+
extend Memoist
|
4
|
+
include Stack::Helper
|
5
|
+
|
6
|
+
def initialize(service, options={})
|
7
|
+
@service = switch_current(service)
|
8
|
+
@options = options
|
9
|
+
|
10
|
+
@pretty_service_name = Ufo.pretty_service_name(@service)
|
11
|
+
@cluster = @options[:cluster] || default_cluster
|
12
|
+
@stack_name = adjust_stack_name(@cluster, @service)
|
13
|
+
end
|
14
|
+
|
15
|
+
def switch_current(service)
|
16
|
+
Current.service!(service)
|
17
|
+
end
|
18
|
+
|
19
|
+
def info
|
20
|
+
Info.new(@service, @options)
|
21
|
+
end
|
22
|
+
memoize :info
|
23
|
+
|
24
|
+
def no_service_message
|
25
|
+
<<-EOL
|
26
|
+
No #{@pretty_service_name.colorize(:green)} found.
|
27
|
+
No CloudFormation stack named #{@stack_name} found.
|
28
|
+
Are sure it exists?
|
29
|
+
EOL
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/ufo/cancel.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Ufo
|
2
|
+
class Cancel < Base
|
3
|
+
def run
|
4
|
+
stack = find_stack(@stack_name)
|
5
|
+
unless stack
|
6
|
+
puts "No #{@pretty_service_name} service to cancel."
|
7
|
+
puts "No #{@stack_name} stack to cancel. Exiting"
|
8
|
+
exit
|
9
|
+
end
|
10
|
+
|
11
|
+
puts "Canceling updates to #{@pretty_service_name}."
|
12
|
+
if stack.stack_status == "CREATE_IN_PROGRESS"
|
13
|
+
cloudformation.delete_stack(stack_name: @stack_name)
|
14
|
+
puts "Canceling stack creation."
|
15
|
+
elsif stack.stack_status =~ /_IN_PROGRESS$/
|
16
|
+
cloudformation.cancel_update_stack(stack_name: @stack_name)
|
17
|
+
puts "Canceling stack update."
|
18
|
+
else
|
19
|
+
puts "The stack is not in a state to that is cancelable: #{stack.stack_status}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/ufo/cli.rb
CHANGED
@@ -6,7 +6,11 @@ module Ufo
|
|
6
6
|
class_option :verbose, type: :boolean
|
7
7
|
class_option :mute, type: :boolean
|
8
8
|
class_option :noop, type: :boolean
|
9
|
-
class_option :cluster, desc: "Cluster. Overrides ufo/settings.yml."
|
9
|
+
class_option :cluster, desc: "Cluster. Overrides .ufo/settings.yml."
|
10
|
+
|
11
|
+
desc "network SUBCOMMAND", "network subcommands"
|
12
|
+
long_desc Help.text(:network)
|
13
|
+
subcommand "network", Network
|
10
14
|
|
11
15
|
desc "docker SUBCOMMAND", "docker subcommands"
|
12
16
|
long_desc Help.text(:docker)
|
@@ -16,6 +20,10 @@ module Ufo
|
|
16
20
|
long_desc Help.text(:tasks)
|
17
21
|
subcommand "tasks", Tasks
|
18
22
|
|
23
|
+
desc "upgrade SUBCOMMAND", "upgrade subcommands"
|
24
|
+
long_desc Help.text(:upgrade)
|
25
|
+
subcommand "upgrade", Upgrade
|
26
|
+
|
19
27
|
long_desc Help.text(:init)
|
20
28
|
Init.cli_options.each do |args|
|
21
29
|
option *args
|
@@ -24,50 +32,66 @@ module Ufo
|
|
24
32
|
|
25
33
|
# common options to deploy. ship, and ships command
|
26
34
|
ship_options = Proc.new do
|
27
|
-
option :task, desc: "ECS task name, to override the task name convention."
|
28
|
-
option :target_group, desc: "ELB Target Group ARN."
|
29
|
-
option :target_group_prompt, type: :boolean, desc: "Enable Target Group ARN prompt", default: true
|
30
|
-
option :wait, type: :boolean, desc: "Wait for deployment to complete", default: false
|
31
|
-
option :pretty, type: :boolean, default: true, desc: "Pretty format the json for the task definitions"
|
32
|
-
option :stop_old_tasks, type: :boolean, default: false, desc: "Stop old tasks after waiting for deploying to complete"
|
33
35
|
option :ecr_keep, type: :numeric, desc: "ECR specific cleanup of old images. Specifies how many images to keep. Only runs if the images are ECR images. Defaults keeps all images."
|
36
|
+
# All elb options remember their 'state'
|
37
|
+
option :elb, desc: "Decides to create elb, not create elb or use existing target group."
|
38
|
+
option :elb_eip_ids, type: :array, desc: "EIP Allocation ids to use for network load balancer."
|
39
|
+
option :elb_type, desc: "ELB type: application or network. Keep current deployed elb type when not specified."
|
40
|
+
option :pretty, type: :boolean, default: true, desc: "Pretty format the json for the task definitions"
|
41
|
+
option :stop_old_tasks, type: :boolean, default: false, desc: "Stop old tasks as part of deployment to speed it up"
|
42
|
+
option :task, desc: "ECS task name, to override the task name convention."
|
43
|
+
option :wait, type: :boolean, desc: "Wait for deployment to complete", default: true
|
34
44
|
end
|
35
45
|
|
36
46
|
desc "deploy SERVICE", "Deploy task definition to ECS service without re-building the definition."
|
37
47
|
long_desc Help.text(:deploy)
|
38
48
|
ship_options.call
|
39
|
-
def deploy(service)
|
49
|
+
def deploy(service=:current)
|
50
|
+
service = service == :current ? Current.service! : service
|
40
51
|
task_definition = options[:task] || service # convention
|
41
52
|
Tasks::Register.register(task_definition, options)
|
42
|
-
ship = Ship.new(service, task_definition
|
53
|
+
ship = Ship.new(service, options.merge(task_definition: task_definition))
|
43
54
|
ship.deploy
|
44
55
|
end
|
45
56
|
|
46
57
|
desc "ship SERVICE", "Builds and ships container image to the ECS service."
|
47
58
|
long_desc Help.text(:ship)
|
48
59
|
ship_options.call
|
49
|
-
def ship(service)
|
60
|
+
def ship(service=:current)
|
61
|
+
service = service == :current ? Current.service! : service
|
50
62
|
builder = build_docker
|
51
63
|
|
52
64
|
task_definition = options[:task] || service # convention
|
53
65
|
Tasks::Builder.ship(task_definition, options)
|
54
|
-
ship = Ship.new(service, task_definition
|
66
|
+
ship = Ship.new(service, options.merge(task_definition: task_definition))
|
55
67
|
ship.deploy
|
56
68
|
|
57
69
|
cleanup(builder.image_name)
|
58
70
|
end
|
59
71
|
|
72
|
+
desc "rollback SERVICE VERSION", "Rolls back to older task definition."
|
73
|
+
long_desc Help.text(:rollback)
|
74
|
+
def rollback(service=:current, version)
|
75
|
+
service = service == :current ? Current.service! : service
|
76
|
+
rollback = Rollback.new(service, options.merge(version: version))
|
77
|
+
rollback.deploy
|
78
|
+
end
|
79
|
+
|
60
80
|
desc "ships [LIST_OF_SERVICES]", "Builds and ships same container image to multiple ECS services."
|
61
81
|
long_desc Help.text(:ships)
|
62
82
|
ship_options.call
|
83
|
+
option :wait, type: :boolean, desc: "Wait for deployment to complete", default: false
|
63
84
|
def ships(*services)
|
64
85
|
builder = build_docker
|
65
86
|
|
87
|
+
if services.empty? && !Current.services&.empty?
|
88
|
+
services = Current.services
|
89
|
+
end
|
66
90
|
services.each_with_index do |service|
|
67
91
|
service_name, task_definition_name = service.split(':')
|
68
92
|
task_definition = task_definition_name || service_name # convention
|
69
93
|
Tasks::Builder.ship(task_definition, options)
|
70
|
-
ship = Ship.new(service, task_definition
|
94
|
+
ship = Ship.new(service, options.merge(task_definition: task_definition))
|
71
95
|
ship.deploy
|
72
96
|
end
|
73
97
|
|
@@ -76,28 +100,78 @@ module Ufo
|
|
76
100
|
|
77
101
|
desc "task TASK_DEFINITION", "Run a one-time task."
|
78
102
|
long_desc Help.text(:task)
|
79
|
-
option :
|
103
|
+
option :task_only, type: :boolean, desc: "Skip docker and task register steps. Only run the task."
|
80
104
|
option :command, type: :array, aliases: 'c', desc: "Override the command used for the container"
|
81
105
|
def task(task_definition)
|
82
|
-
Docker::Builder.build(options)
|
83
|
-
Tasks::Builder.ship(task_definition, options)
|
106
|
+
Docker::Builder.build(options) unless @options[:task_only]
|
107
|
+
Tasks::Builder.ship(task_definition, options) unless @options[:task_only]
|
84
108
|
Task.new(task_definition, options).run
|
85
109
|
end
|
86
110
|
|
111
|
+
desc "cancel SERVICE", "Cancel creation or update of the ECS service."
|
112
|
+
long_desc Help.text(:cancel)
|
113
|
+
option :sure, type: :boolean, desc: "By pass are you sure prompt."
|
114
|
+
def cancel(service=:current)
|
115
|
+
task_definition = options[:task] || service # convention
|
116
|
+
Cancel.new(service, options).run
|
117
|
+
end
|
118
|
+
|
119
|
+
desc "current SERVICE", "Switch the current service. Saves to `.ufo/current`"
|
120
|
+
long_desc Help.text(:current)
|
121
|
+
option :rm, type: :boolean, desc: "Remove all current settings. Removes `.ufo/current`"
|
122
|
+
option :service, desc: "Sets service as a current setting."
|
123
|
+
option :services, type: :array, desc: "Sets services as a current setting. This is used for ufo ships."
|
124
|
+
option :env_extra, desc: "Sets UFO_ENV_EXTRA as a current setting."
|
125
|
+
def current
|
126
|
+
Current.new(options).run
|
127
|
+
end
|
128
|
+
|
87
129
|
desc "destroy SERVICE", "Destroy the ECS service."
|
88
130
|
long_desc Help.text(:destroy)
|
89
131
|
option :sure, type: :boolean, desc: "By pass are you sure prompt."
|
90
|
-
|
132
|
+
option :wait, type: :boolean, desc: "Wait for completion", default: true
|
133
|
+
def destroy(service=:current)
|
91
134
|
task_definition = options[:task] || service # convention
|
92
135
|
Destroy.new(service, options).bye
|
93
136
|
end
|
94
137
|
|
138
|
+
desc "apps", "List apps."
|
139
|
+
long_desc Help.text(:apps)
|
140
|
+
def apps
|
141
|
+
Apps.new(options).list
|
142
|
+
end
|
143
|
+
|
144
|
+
desc "resources SERVICE", "The ECS service resources."
|
145
|
+
long_desc Help.text(:resources)
|
146
|
+
def resources(service=:current)
|
147
|
+
Info.new(service, options).run
|
148
|
+
end
|
149
|
+
|
95
150
|
desc "scale SERVICE COUNT", "Scale the ECS service."
|
96
151
|
long_desc Help.text(:scale)
|
97
|
-
def scale(service, count)
|
152
|
+
def scale(service=:current, count)
|
98
153
|
Scale.new(service, count, options).update
|
99
154
|
end
|
100
155
|
|
156
|
+
desc "ps SERVICE", "Show process info on ECS service."
|
157
|
+
long_desc Help.text(:ps)
|
158
|
+
option :summary, type: :boolean, default: true, desc: "Display summary header info."
|
159
|
+
def ps(service=:current)
|
160
|
+
Ps.new(service, options).run
|
161
|
+
end
|
162
|
+
|
163
|
+
desc "releases SERVICE", "Show possible 'releases' or task definitions for the service."
|
164
|
+
long_desc Help.text(:releases)
|
165
|
+
def releases(service=:current)
|
166
|
+
Releases.new(service, options).list
|
167
|
+
end
|
168
|
+
|
169
|
+
desc "stop SERVICE", "Stop tasks from old deployments. Can speed up deployments with network load balancer."
|
170
|
+
long_desc Help.text(:stop)
|
171
|
+
def stop(service=:current)
|
172
|
+
Stop.new(service, options).run
|
173
|
+
end
|
174
|
+
|
101
175
|
desc "completion *PARAMS", "Prints words for auto-completion."
|
102
176
|
long_desc Help.text("completion")
|
103
177
|
def completion(*params)
|
@@ -110,16 +184,6 @@ module Ufo
|
|
110
184
|
Completer::Script.generate
|
111
185
|
end
|
112
186
|
|
113
|
-
desc "upgrade3", "Upgrade from version 2 to 3."
|
114
|
-
def upgrade3
|
115
|
-
Upgrade3.new(options).run
|
116
|
-
end
|
117
|
-
|
118
|
-
desc "upgrade3_3_to_3_4", "Upgrade from version 3.3 to 3.4"
|
119
|
-
def upgrade3_3_to_3_4
|
120
|
-
Upgrade33_to_34.new(options).run
|
121
|
-
end
|
122
|
-
|
123
187
|
desc "version", "Prints version number of installed ufo."
|
124
188
|
def version
|
125
189
|
puts VERSION
|
data/lib/ufo/core.rb
CHANGED
@@ -3,6 +3,8 @@ require 'yaml'
|
|
3
3
|
|
4
4
|
module Ufo
|
5
5
|
module Core
|
6
|
+
extend Memoist
|
7
|
+
|
6
8
|
def check_task_definition!(task_definition)
|
7
9
|
task_definition_path = "#{Ufo.root}/.ufo/output/#{task_definition}.json"
|
8
10
|
unless File.exist?(task_definition_path)
|
@@ -18,12 +20,42 @@ module Ufo
|
|
18
20
|
Pathname.new(path)
|
19
21
|
end
|
20
22
|
|
21
|
-
@@env = nil
|
22
23
|
def env
|
23
|
-
return @@env if @@env
|
24
24
|
ufo_env = env_from_profile(ENV['AWS_PROFILE']) || 'development'
|
25
25
|
ufo_env = ENV['UFO_ENV'] if ENV['UFO_ENV'] # highest precedence
|
26
|
-
|
26
|
+
ufo_env
|
27
|
+
end
|
28
|
+
memoize :env
|
29
|
+
|
30
|
+
def env_extra
|
31
|
+
env_extra = Current.env_extra
|
32
|
+
env_extra = ENV['UFO_ENV_EXTRA'] if ENV['UFO_ENV_EXTRA'] # highest precedence
|
33
|
+
return if env_extra&.empty?
|
34
|
+
env_extra
|
35
|
+
end
|
36
|
+
memoize :env_extra
|
37
|
+
|
38
|
+
def pretty_service_name(service)
|
39
|
+
[service, Ufo.env_extra].reject {|x| x==''}.compact.join('-')
|
40
|
+
end
|
41
|
+
|
42
|
+
def settings
|
43
|
+
Setting.new.data
|
44
|
+
end
|
45
|
+
memoize :settings
|
46
|
+
|
47
|
+
def cfn_profile
|
48
|
+
settings[:cfn_profile] || "default"
|
49
|
+
end
|
50
|
+
|
51
|
+
def check_ufo_project!
|
52
|
+
check_path = "#{Ufo.root}/.ufo/settings.yml"
|
53
|
+
unless File.exist?(check_path)
|
54
|
+
puts "ERROR: No settings file at #{check_path}. Are you sure you are in a project with ufo setup?".colorize(:red)
|
55
|
+
puts "Current directory: #{Dir.pwd}"
|
56
|
+
puts "If you want to set up ufo for this prjoect, please create a settings file via: ufo init"
|
57
|
+
exit 1 unless ENV['TEST']
|
58
|
+
end
|
27
59
|
end
|
28
60
|
|
29
61
|
private
|
data/lib/ufo/current.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Ufo
|
5
|
+
class Current
|
6
|
+
def initialize(options={})
|
7
|
+
Ufo.check_ufo_project!
|
8
|
+
@options = options
|
9
|
+
@file = ".ufo/current"
|
10
|
+
@path = "#{Ufo.root}/#{@file}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
@options[:rm] ? rm : set
|
15
|
+
end
|
16
|
+
|
17
|
+
def rm
|
18
|
+
FileUtils.rm_f(@path)
|
19
|
+
puts "Current settings have been removed. Removed #{@file}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def set
|
23
|
+
if @options.empty?
|
24
|
+
show
|
25
|
+
else
|
26
|
+
d = data # assign data to d to create local variable for merge to work
|
27
|
+
d = d.merge(@options).delete_if do |_,v|
|
28
|
+
v&.empty? || v == ['']
|
29
|
+
end
|
30
|
+
text = YAML.dump(d)
|
31
|
+
IO.write(@path, text)
|
32
|
+
puts "Current settings saved in .ufo/current"
|
33
|
+
show
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def show
|
38
|
+
if data.empty?
|
39
|
+
puts <<-EOL
|
40
|
+
There are no current settings. To set a current service run:
|
41
|
+
|
42
|
+
ufo current --service my-service
|
43
|
+
ufo current -h # for more examples
|
44
|
+
EOL
|
45
|
+
return
|
46
|
+
end
|
47
|
+
|
48
|
+
data.each do |key, value|
|
49
|
+
puts "Current #{key}: #{value}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def data
|
54
|
+
YAML.load(IO.read(@path)) rescue {}
|
55
|
+
end
|
56
|
+
|
57
|
+
def env_extra
|
58
|
+
current = data["env_extra"]
|
59
|
+
return current unless current&.empty?
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.env_extra
|
63
|
+
Current.new.env_extra
|
64
|
+
end
|
65
|
+
|
66
|
+
def services
|
67
|
+
return data["services"] || []
|
68
|
+
end
|
69
|
+
|
70
|
+
# reads services, returns [] if not set
|
71
|
+
def self.services
|
72
|
+
Current.new.services
|
73
|
+
end
|
74
|
+
|
75
|
+
def service
|
76
|
+
current = data["service"]
|
77
|
+
return current unless current&.empty?
|
78
|
+
end
|
79
|
+
|
80
|
+
# reads service, returns nil if not set
|
81
|
+
def self.service
|
82
|
+
Current.new.service
|
83
|
+
end
|
84
|
+
|
85
|
+
# reads service, will exit if current service not set
|
86
|
+
def self.service!(service=:current)
|
87
|
+
return service if service != :current
|
88
|
+
|
89
|
+
service = Current.service
|
90
|
+
return service if service
|
91
|
+
|
92
|
+
puts "ERROR: service must be specified.".colorize(:red)
|
93
|
+
puts <<-EOL
|
94
|
+
Example:
|
95
|
+
ufo #{ARGV.first} SERVICE
|
96
|
+
You can also set a current service to be remembered with:
|
97
|
+
ufo current SERVICE
|
98
|
+
EOL
|
99
|
+
exit 1
|
100
|
+
# if want to display full help menu:
|
101
|
+
# Ufo::CLI.start(ARGV + ["-h"])
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|