ufo 4.4.3 → 4.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/CHANGELOG.md +6 -0
- data/docs/_docs/conventions.md +1 -1
- data/docs/_docs/extras/codebuild-iam-role.md +1 -1
- data/docs/_docs/extras/dockerfile-erb.md +60 -0
- data/docs/_docs/extras/ecs-network-mode.md +1 -1
- data/docs/_docs/extras/load-balancer.md +1 -1
- data/docs/_docs/extras/minimal-deploy-iam.md +1 -1
- data/docs/_docs/extras/redirection-support.md +1 -1
- data/docs/_docs/extras/route53-support.md +1 -1
- data/docs/_docs/extras/security-groups.md +1 -1
- data/docs/_docs/extras/ssl-support.md +1 -1
- data/docs/_docs/faq.md +2 -2
- data/docs/_docs/helpers.md +1 -1
- data/docs/_docs/more/auto-completion.md +11 -15
- data/docs/_docs/more/automated-cleanup.md +1 -1
- data/docs/_docs/more/customize-cloudformation.md +5 -5
- data/docs/_docs/more/migrations.md +5 -11
- data/docs/_docs/more/run-in-pieces.md +6 -12
- data/docs/_docs/more/single-task.md +9 -14
- data/docs/_docs/more/stuck-cloudformation.md +1 -1
- data/docs/_docs/more/why-cloudformation.md +1 -1
- data/docs/_docs/next-steps.md +1 -1
- data/docs/_docs/settings.md +3 -60
- data/docs/_docs/settings/aws_profile.md +36 -0
- data/docs/_docs/{settings-cfn.md → settings/cfn.md} +2 -0
- data/docs/_docs/settings/cluster.md +72 -0
- data/docs/_docs/{settings-network.md → settings/network.md} +3 -1
- data/docs/_docs/structure.md +1 -1
- data/docs/_docs/ufo-current.md +1 -1
- data/docs/_docs/ufo-env-extra.md +1 -1
- data/docs/_docs/ufo-env.md +1 -1
- data/docs/_docs/{params.md → ufo-task-params.md} +13 -6
- data/docs/_docs/upgrading.md +1 -1
- data/docs/_docs/upgrading/upgrade4.5.md +54 -0
- data/docs/_docs/upgrading/upgrade4.md +1 -1
- data/docs/_docs/variables.md +1 -1
- data/docs/_includes/subnav.html +13 -4
- data/docs/_reference/ufo-apps.md +1 -0
- data/docs/_reference/ufo-docker-base.md +10 -0
- data/docs/_reference/ufo-network-init.md +6 -5
- data/docs/_reference/ufo-task.md +10 -0
- data/docs/_reference/ufo-upgrade-v43to45.md +15 -0
- data/docs/_reference/ufo-upgrade.md +1 -1
- data/docs/articles.md +1 -1
- data/lib/ufo.rb +3 -37
- data/lib/ufo/apps.rb +18 -11
- data/lib/ufo/apps/cfn_map.rb +1 -1
- data/lib/ufo/apps/cluster.rb +24 -0
- data/lib/ufo/autoloader.rb +21 -0
- data/lib/ufo/base.rb +3 -3
- data/lib/ufo/cli.rb +2 -1
- data/lib/ufo/completer.rb +0 -2
- data/lib/ufo/docker.rb +0 -5
- data/lib/ufo/docker/builder.rb +12 -4
- data/lib/ufo/docker/compiler.rb +21 -0
- data/lib/ufo/docker/dockerfile.rb +1 -2
- data/lib/ufo/docker/variables.rb +26 -0
- data/lib/ufo/dsl.rb +0 -4
- data/lib/ufo/help/docker/base.md +10 -0
- data/lib/ufo/help/task.md +10 -0
- data/lib/ufo/network.rb +0 -4
- data/lib/ufo/param.rb +1 -16
- data/lib/ufo/ps.rb +0 -2
- data/lib/ufo/setting.rb +0 -2
- data/lib/ufo/ship.rb +2 -3
- data/lib/ufo/stack.rb +1 -4
- data/lib/ufo/stack/context.rb +4 -4
- data/lib/ufo/stack/helper.rb +10 -4
- data/lib/ufo/task.rb +2 -1
- data/lib/ufo/tasks.rb +0 -3
- data/lib/ufo/upgrade.rb +3 -8
- data/lib/ufo/upgrade/{upgrade43to44.rb → upgrade43to45.rb} +5 -5
- data/lib/ufo/util.rb +5 -2
- data/lib/ufo/version.rb +1 -1
- data/spec/fixtures/settings.yml +1 -1
- data/ufo.gemspec +1 -0
- metadata +30 -13
- data/Gemfile.lock +0 -113
- data/docs/_docs/upgrading/upgrade4.4.md +0 -39
- data/docs/_reference/ufo-upgrade-v43to44.md +0 -15
- data/lib/ufo/ecr.rb +0 -6
- data/lib/ufo/ecs.rb +0 -5
data/lib/ufo/apps.rb
CHANGED
@@ -2,33 +2,40 @@ require 'text-table'
|
|
2
2
|
|
3
3
|
module Ufo
|
4
4
|
class Apps
|
5
|
-
autoload :CfnMap, "ufo/apps/cfn_map"
|
6
|
-
autoload :Service, "ufo/apps/service"
|
7
|
-
|
8
5
|
extend Memoist
|
9
6
|
include Stack::Helper
|
10
7
|
|
11
8
|
def initialize(options)
|
12
9
|
@options = options
|
13
|
-
@
|
10
|
+
@clusters = @options[:cluster] || @options[:clusters]
|
11
|
+
@clusters = [@clusters].flatten.compact
|
12
|
+
if @clusters.empty?
|
13
|
+
@clusters = Cluster.all
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def list_all
|
18
|
+
@clusters.each do |cluster|
|
19
|
+
list(cluster)
|
20
|
+
end
|
14
21
|
end
|
15
22
|
|
16
|
-
def list
|
23
|
+
def list(cluster)
|
17
24
|
begin
|
18
|
-
resp = ecs.list_services(cluster:
|
25
|
+
resp = ecs.list_services(cluster: cluster)
|
19
26
|
rescue Aws::ECS::Errors::ClusterNotFoundException => e
|
20
|
-
puts "ECS cluster #{
|
21
|
-
|
27
|
+
puts "ECS cluster #{cluster.color(:green)} not found."
|
28
|
+
return
|
22
29
|
end
|
23
30
|
arns = resp.service_arns.sort
|
24
31
|
|
25
|
-
puts "Listing ECS services in the #{
|
32
|
+
puts "Listing ECS services in the #{cluster.color(:green)} cluster."
|
26
33
|
if arns.empty?
|
27
|
-
puts "No ECS services found in the #{
|
34
|
+
puts "No ECS services found in the #{cluster.color(:green)} cluster."
|
28
35
|
return
|
29
36
|
end
|
30
37
|
|
31
|
-
resp = ecs.describe_services(services: arns, cluster:
|
38
|
+
resp = ecs.describe_services(services: arns, cluster: cluster)
|
32
39
|
display_info(resp)
|
33
40
|
end
|
34
41
|
|
data/lib/ufo/apps/cfn_map.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
class Ufo::Apps
|
2
|
+
class Cluster
|
3
|
+
def self.all
|
4
|
+
new.all
|
5
|
+
end
|
6
|
+
|
7
|
+
def all
|
8
|
+
Ufo.check_ufo_project!
|
9
|
+
clusters = if settings[:service_cluster]
|
10
|
+
settings[:service_cluster].values
|
11
|
+
elsif settings[:cluster]
|
12
|
+
settings[:cluster]
|
13
|
+
else
|
14
|
+
Ufo.env
|
15
|
+
end
|
16
|
+
[clusters].flatten.compact
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def settings
|
21
|
+
@settings ||= Ufo.settings
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "zeitwerk"
|
2
|
+
|
3
|
+
module Ufo
|
4
|
+
class Autoloader
|
5
|
+
class Inflector < Zeitwerk::Inflector
|
6
|
+
def camelize(basename, _abspath)
|
7
|
+
map = { cli: "CLI", dsl: "DSL", version: "VERSION" }
|
8
|
+
map[basename.to_sym] || super
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def setup
|
14
|
+
loader = Zeitwerk::Loader.new
|
15
|
+
loader.inflector = Inflector.new
|
16
|
+
loader.push_dir(File.dirname(__dir__)) # lib
|
17
|
+
loader.setup
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/ufo/base.rb
CHANGED
@@ -7,7 +7,7 @@ module Ufo
|
|
7
7
|
@service = switch_current(service)
|
8
8
|
@options = options
|
9
9
|
|
10
|
-
@cluster = @options[:cluster] || default_cluster
|
10
|
+
@cluster = @options[:cluster] || default_cluster(@service)
|
11
11
|
@stack_name = adjust_stack_name(@cluster, @service)
|
12
12
|
end
|
13
13
|
|
@@ -22,8 +22,8 @@ module Ufo
|
|
22
22
|
|
23
23
|
def no_service_message
|
24
24
|
<<-EOL
|
25
|
-
No #{@service.color(:green)} found.
|
26
|
-
No CloudFormation stack named #{@stack_name} found.
|
25
|
+
No #{@service.color(:green)} ecs service found.
|
26
|
+
No CloudFormation stack named #{@stack_name.color(:green)} found.
|
27
27
|
Are sure it exists?
|
28
28
|
EOL
|
29
29
|
end
|
data/lib/ufo/cli.rb
CHANGED
@@ -143,8 +143,9 @@ module Ufo
|
|
143
143
|
|
144
144
|
desc "apps", "List apps."
|
145
145
|
long_desc Help.text(:apps)
|
146
|
+
option :clusters, type: :array, desc: "List of clusters"
|
146
147
|
def apps
|
147
|
-
Apps.new(options).
|
148
|
+
Apps.new(options).list_all
|
148
149
|
end
|
149
150
|
|
150
151
|
desc "resources SERVICE", "The ECS service resources."
|
data/lib/ufo/completer.rb
CHANGED
data/lib/ufo/docker.rb
CHANGED
@@ -1,10 +1,5 @@
|
|
1
1
|
module Ufo
|
2
2
|
class Docker < Command
|
3
|
-
autoload :Builder, 'ufo/docker/builder'
|
4
|
-
autoload :Pusher, 'ufo/docker/pusher'
|
5
|
-
autoload :Dockerfile, 'ufo/docker/dockerfile'
|
6
|
-
autoload :Cleaner, 'ufo/docker/cleaner'
|
7
|
-
|
8
3
|
desc "build", "Build docker image."
|
9
4
|
long_desc Help.text("docker:build")
|
10
5
|
option :push, type: :boolean, default: false
|
data/lib/ufo/docker/builder.rb
CHANGED
@@ -23,12 +23,12 @@ class Ufo::Docker
|
|
23
23
|
start_time = Time.now
|
24
24
|
store_full_image_name
|
25
25
|
|
26
|
-
update_auth_token
|
27
|
-
|
28
26
|
command = "docker build #{build_options}-t #{full_image_name} -f #{@dockerfile} ."
|
29
27
|
say "Building docker image with:".color(:green)
|
30
28
|
say " #{command}".color(:green)
|
29
|
+
compile_dockerfile_erb
|
31
30
|
check_dockerfile_exists
|
31
|
+
update_auth_token
|
32
32
|
command = "cd #{Ufo.root} && #{command}"
|
33
33
|
success = execute(command, use_system: true)
|
34
34
|
unless success
|
@@ -81,6 +81,10 @@ class Ufo::Docker
|
|
81
81
|
@pusher ||= Pusher.new(full_image_name, @options)
|
82
82
|
end
|
83
83
|
|
84
|
+
def compile_dockerfile_erb
|
85
|
+
Compiler.new("#{Ufo.root}/#{@dockerfile}").compile
|
86
|
+
end
|
87
|
+
|
84
88
|
def check_dockerfile_exists
|
85
89
|
unless File.exist?("#{Ufo.root}/#{@dockerfile}")
|
86
90
|
puts "#{@dockerfile} does not exist. Are you sure it exists?"
|
@@ -139,8 +143,12 @@ class Ufo::Docker
|
|
139
143
|
end
|
140
144
|
|
141
145
|
def update_dockerfile
|
142
|
-
|
143
|
-
|
146
|
+
updater = if File.exist?("#{Ufo.root}/Dockerfile.erb") # dont use @dockerfile on purpose
|
147
|
+
Variables.new(full_image_name, @options)
|
148
|
+
else
|
149
|
+
Dockerfile.new(full_image_name, @options)
|
150
|
+
end
|
151
|
+
updater.update
|
144
152
|
end
|
145
153
|
|
146
154
|
def say(msg)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Ufo::Docker
|
2
|
+
class Compiler
|
3
|
+
def initialize(dockerfile)
|
4
|
+
@dockerfile = dockerfile
|
5
|
+
@erb_file = "#{dockerfile}.erb"
|
6
|
+
end
|
7
|
+
|
8
|
+
def compile
|
9
|
+
return unless File.exist?(@erb_file)
|
10
|
+
|
11
|
+
puts "Compiled #{File.basename(@erb_file).color(:green)} to #{File.basename(@dockerfile).color(:green)}"
|
12
|
+
path = "#{Ufo.root}/.ufo/settings/dockerfile_variables.yml"
|
13
|
+
vars = YAML.load_file(path)[Ufo.env] if File.exist?(path)
|
14
|
+
vars ||= {}
|
15
|
+
result = RenderMePretty.result(@erb_file, vars)
|
16
|
+
comment = "# Note this file was generated from #{File.basename(@erb_file)} as a part of running ufo ship"
|
17
|
+
result = "#{comment}\n#{result}"
|
18
|
+
IO.write(@dockerfile, result)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Ufo::Docker
|
2
|
+
class Variables
|
3
|
+
@@variables_path = "#{Ufo.root}/.ufo/settings/dockerfile_variables.yml"
|
4
|
+
|
5
|
+
def initialize(full_image_name, options={})
|
6
|
+
@full_image_name, @options = full_image_name, options
|
7
|
+
end
|
8
|
+
|
9
|
+
def update
|
10
|
+
data = current_data
|
11
|
+
data[Ufo.env] ||= {}
|
12
|
+
data[Ufo.env]["base_image"] = @full_image_name
|
13
|
+
pretty_path = @@variables_path.sub("#{Ufo.root}/", "")
|
14
|
+
IO.write(@@variables_path, YAML.dump(data))
|
15
|
+
|
16
|
+
unless @options[:mute]
|
17
|
+
puts "The #{pretty_path} base_image has been updated with the latest base image:".color(:green)
|
18
|
+
puts " #{@full_image_name}".color(:green)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def current_data
|
23
|
+
File.exist?(@@variables_path) ? YAML.load_file(@@variables_path) : {}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/ufo/dsl.rb
CHANGED
@@ -2,10 +2,6 @@ require 'ostruct'
|
|
2
2
|
|
3
3
|
module Ufo
|
4
4
|
class DSL
|
5
|
-
autoload :TaskDefinition, 'ufo/dsl/task_definition'
|
6
|
-
autoload :Outputter, 'ufo/dsl/outputter'
|
7
|
-
autoload :Helper, 'ufo/dsl/helper'
|
8
|
-
|
9
5
|
def initialize(template_definitions_path, options={})
|
10
6
|
@template_definitions_path = template_definitions_path
|
11
7
|
@options = options
|
data/lib/ufo/help/docker/base.md
CHANGED
@@ -36,4 +36,14 @@ Some of the output has been excluded so we can focus on the important parts to p
|
|
36
36
|
|
37
37
|
It is using the docker `-f Dockerfile.base` option to build the base image. It names the image with `tongueroo/demo-ufo:base-2017-06-12T14-36-44-2af505e`. The image tag contains useful information: the timestamp when the image was built and the exact git sha of the code. The image gets push to a registry immediately.
|
38
38
|
|
39
|
+
## Dockerfile FROM updated
|
40
|
+
|
39
41
|
Notice at the very end, the *current* `Dockerfile`'s FROM statement has been updated with the newly built base Docker image automatically. This saves you from forgetting to copying and pasting it the `Dockerfile` yourself.
|
42
|
+
|
43
|
+
If you're using a [Dockerfile.erb](https://ufoships.com/docs/extras/dockerfile-erb/), then ufo will update the `.ufo/settings/dockerfile_variables.yml` file instead. It assumes you're using a Dockerfile.erb that looks something like this:
|
44
|
+
|
45
|
+
```Dockerfile
|
46
|
+
FROM <%= @base_image %>
|
47
|
+
# ...
|
48
|
+
CMD ["bin/web"]
|
49
|
+
```
|
data/lib/ufo/help/task.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
The `ufo task` commands:
|
2
|
+
|
3
|
+
1. Builds the docker image
|
4
|
+
2. Registers the ECS task definition
|
5
|
+
3. Runs the command
|
6
|
+
|
1
7
|
## Examples
|
2
8
|
|
3
9
|
You can use the `--command` or `-c` option to override the Docker container command.
|
@@ -15,3 +21,7 @@ The `--task-only` option is useful. By default, the `ufo task` command will buil
|
|
15
21
|
ufo task demo-web -c uptime # build at least once
|
16
22
|
ufo task demo-web --task-only -c ls # skip docker for speed
|
17
23
|
ufo task demo-web --task-only -c pwd # skip docker for speed
|
24
|
+
|
25
|
+
## Params
|
26
|
+
|
27
|
+
You can control and customize the params that get sent to the ECS run_task call with a `config/params.yml` file. More info here: https://ufoships.com/docs/ufo-task-params/
|
data/lib/ufo/network.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
1
|
module Ufo
|
2
2
|
class Network < Command
|
3
|
-
autoload :Init, "ufo/network/init"
|
4
|
-
autoload :Helper, "ufo/network/helper"
|
5
|
-
autoload :Fetch, "ufo/network/fetch"
|
6
|
-
|
7
3
|
def self.cli_options
|
8
4
|
[
|
9
5
|
[:force, type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files."],
|
data/lib/ufo/param.rb
CHANGED
@@ -9,7 +9,7 @@ module Ufo
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def data
|
12
|
-
|
12
|
+
return {} unless File.exist?(@params_path)
|
13
13
|
|
14
14
|
result = RenderMePretty.result(@params_path, context: template_scope)
|
15
15
|
data = YAML.load(result) || {}
|
@@ -20,20 +20,5 @@ module Ufo
|
|
20
20
|
def template_scope
|
21
21
|
@template_scope ||= Ufo::TemplateScope.new(Ufo::DSL::Helper.new, nil)
|
22
22
|
end
|
23
|
-
|
24
|
-
# Ufo version 3.3 to 3.4 added a concept of a .ufo/params.yml file to support
|
25
|
-
# fargate: https://github.com/tongueroo/ufo/pull/31
|
26
|
-
#
|
27
|
-
# Warn user and tell them to run the `ufo upgrade v3_3to3_4` command to upgrade.
|
28
|
-
def upgrade_message!
|
29
|
-
return if File.exist?(@params_path)
|
30
|
-
|
31
|
-
puts "ERROR: Your project is missing the .ufo/params.yml.".color(:red)
|
32
|
-
puts "This was added in ufo version 3.4"
|
33
|
-
puts "You can find more info about the params file here: http://ufoships.com/docs/params/"
|
34
|
-
puts "To upgrade run:"
|
35
|
-
puts " ufo upgrade v3_3to3_4"
|
36
|
-
exit 1
|
37
|
-
end
|
38
23
|
end
|
39
24
|
end
|
data/lib/ufo/ps.rb
CHANGED
data/lib/ufo/setting.rb
CHANGED
data/lib/ufo/ship.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Ufo
|
2
2
|
class UfoError < RuntimeError; end
|
3
3
|
class ShipmentOverridden < UfoError; end
|
4
|
-
autoload :KillTask, 'ufo/ship/kill_task'
|
5
4
|
|
6
5
|
class Ship < Base
|
7
6
|
def initialize(service, options={})
|
@@ -10,13 +9,13 @@ module Ufo
|
|
10
9
|
end
|
11
10
|
|
12
11
|
def deploy
|
13
|
-
message = "Deploying #{@service}..."
|
12
|
+
message = "Deploying service #{@service.color(:green)} to cluster #{@cluster.color(:green)}..."
|
14
13
|
unless @options[:mute]
|
15
14
|
if @options[:noop]
|
16
15
|
puts "NOOP: #{message}"
|
17
16
|
return
|
18
17
|
else
|
19
|
-
puts message
|
18
|
+
puts message
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
data/lib/ufo/stack.rb
CHANGED
@@ -23,9 +23,6 @@
|
|
23
23
|
#
|
24
24
|
module Ufo
|
25
25
|
class Stack
|
26
|
-
autoload :Context, "ufo/stack/context"
|
27
|
-
autoload :Helper, "ufo/stack/helper"
|
28
|
-
autoload :Status, "ufo/stack/status"
|
29
26
|
extend Memoist
|
30
27
|
include Helper
|
31
28
|
|
@@ -33,7 +30,7 @@ module Ufo
|
|
33
30
|
@options = options
|
34
31
|
@task_definition = options[:task_definition]
|
35
32
|
@service = options[:service]
|
36
|
-
@cluster = @options[:cluster] || default_cluster
|
33
|
+
@cluster = @options[:cluster] || default_cluster(@service)
|
37
34
|
@stack_name = adjust_stack_name(@cluster, options[:service])
|
38
35
|
end
|
39
36
|
|
data/lib/ufo/stack/context.rb
CHANGED
@@ -91,12 +91,12 @@ class Ufo::Stack
|
|
91
91
|
create_elb == "true" # convert to boolean
|
92
92
|
end
|
93
93
|
|
94
|
-
#
|
95
|
-
#
|
94
|
+
# If --elb is not set at all and is nil, then it defaults to creating the load balancer if the ecs service has
|
95
|
+
# a container name "web".
|
96
96
|
#
|
97
|
-
# --elb '' -
|
97
|
+
# --elb '' - will not crete an elb
|
98
98
|
# --elb 'auto' - creates an elb
|
99
|
-
# --elb arn:... -
|
99
|
+
# --elb arn:... - will not create elb and use the existing target group
|
100
100
|
#
|
101
101
|
def elb_options
|
102
102
|
case @options[:elb]
|
data/lib/ufo/stack/helper.rb
CHANGED
@@ -17,14 +17,20 @@ class Ufo::Stack
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def adjust_stack_name(cluster, service)
|
20
|
-
|
21
|
-
|
22
|
-
puts "
|
20
|
+
upgraded_namings = %w[append_ufo_env append_env append_cluster]
|
21
|
+
unless upgraded_namings.include?(settings[:stack_naming])
|
22
|
+
puts "WARN: In ufo v4.6 the UFO_ENV value gets appends to the end of the CloudFormation stack name. This means a new stack gets created. You must upgrade to using the new stack and delete the old stack manually. More info: http://ufoships.com/docs/upgrading/upgrade4.x/".color(:yellow)
|
23
|
+
puts "To get rid of this warning you can add `stack_naming: append_ufo_env` to your `.ufo/settings.yml config. New versions of ufo init do this automatically."
|
23
24
|
puts "Pausing for 20 seconds."
|
24
25
|
sleep 20
|
25
26
|
end
|
26
27
|
|
27
|
-
parts =
|
28
|
+
parts = case settings[:stack_naming]
|
29
|
+
when "append_ufo_env" # ufo v4.6
|
30
|
+
[service, Ufo.env, Ufo.env_extra]
|
31
|
+
when "append_env", "append_cluster" # ufo v4.5
|
32
|
+
# append_env will be removed in the next major version in favor of apend_cluster.
|
33
|
+
# To avoid confusiong with append_ufo_env
|
28
34
|
[service, cluster, Ufo.env_extra]
|
29
35
|
else
|
30
36
|
# legacy, to be removed in next major version
|