fog-aws 0.4.1 → 0.5.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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/lib/fog/aws.rb +2 -0
  3. data/lib/fog/aws/ecs.rb +187 -0
  4. data/lib/fog/aws/models/compute/flavors.rb +10 -0
  5. data/lib/fog/aws/parsers/ecs/base.rb +28 -0
  6. data/lib/fog/aws/parsers/ecs/container_instance.rb +75 -0
  7. data/lib/fog/aws/parsers/ecs/create_cluster.rb +30 -0
  8. data/lib/fog/aws/parsers/ecs/create_service.rb +31 -0
  9. data/lib/fog/aws/parsers/ecs/delete_cluster.rb +30 -0
  10. data/lib/fog/aws/parsers/ecs/delete_service.rb +31 -0
  11. data/lib/fog/aws/parsers/ecs/deregister_container_instance.rb +31 -0
  12. data/lib/fog/aws/parsers/ecs/deregister_task_definition.rb +32 -0
  13. data/lib/fog/aws/parsers/ecs/describe_clusters.rb +55 -0
  14. data/lib/fog/aws/parsers/ecs/describe_container_instances.rb +38 -0
  15. data/lib/fog/aws/parsers/ecs/describe_services.rb +24 -0
  16. data/lib/fog/aws/parsers/ecs/describe_task_definition.rb +32 -0
  17. data/lib/fog/aws/parsers/ecs/describe_tasks.rb +24 -0
  18. data/lib/fog/aws/parsers/ecs/list_clusters.rb +27 -0
  19. data/lib/fog/aws/parsers/ecs/list_container_instances.rb +27 -0
  20. data/lib/fog/aws/parsers/ecs/list_services.rb +27 -0
  21. data/lib/fog/aws/parsers/ecs/list_task_definition_families.rb +27 -0
  22. data/lib/fog/aws/parsers/ecs/list_task_definitions.rb +27 -0
  23. data/lib/fog/aws/parsers/ecs/list_tasks.rb +27 -0
  24. data/lib/fog/aws/parsers/ecs/register_task_definition.rb +32 -0
  25. data/lib/fog/aws/parsers/ecs/run_task.rb +24 -0
  26. data/lib/fog/aws/parsers/ecs/service.rb +82 -0
  27. data/lib/fog/aws/parsers/ecs/start_task.rb +24 -0
  28. data/lib/fog/aws/parsers/ecs/stop_task.rb +23 -0
  29. data/lib/fog/aws/parsers/ecs/task.rb +77 -0
  30. data/lib/fog/aws/parsers/ecs/task_definition.rb +95 -0
  31. data/lib/fog/aws/parsers/ecs/update_service.rb +31 -0
  32. data/lib/fog/aws/requests/compute/create_vpc.rb +1 -1
  33. data/lib/fog/aws/requests/ecs/create_cluster.rb +64 -0
  34. data/lib/fog/aws/requests/ecs/create_service.rb +118 -0
  35. data/lib/fog/aws/requests/ecs/delete_cluster.rb +61 -0
  36. data/lib/fog/aws/requests/ecs/delete_service.rb +72 -0
  37. data/lib/fog/aws/requests/ecs/deregister_container_instance.rb +63 -0
  38. data/lib/fog/aws/requests/ecs/deregister_task_definition.rb +58 -0
  39. data/lib/fog/aws/requests/ecs/describe_clusters.rb +83 -0
  40. data/lib/fog/aws/requests/ecs/describe_container_instances.rb +64 -0
  41. data/lib/fog/aws/requests/ecs/describe_services.rb +76 -0
  42. data/lib/fog/aws/requests/ecs/describe_task_definition.rb +64 -0
  43. data/lib/fog/aws/requests/ecs/describe_tasks.rb +65 -0
  44. data/lib/fog/aws/requests/ecs/list_clusters.rb +45 -0
  45. data/lib/fog/aws/requests/ecs/list_container_instances.rb +46 -0
  46. data/lib/fog/aws/requests/ecs/list_services.rb +59 -0
  47. data/lib/fog/aws/requests/ecs/list_task_definition_families.rb +56 -0
  48. data/lib/fog/aws/requests/ecs/list_task_definitions.rb +55 -0
  49. data/lib/fog/aws/requests/ecs/list_tasks.rb +50 -0
  50. data/lib/fog/aws/requests/ecs/register_task_definition.rb +68 -0
  51. data/lib/fog/aws/requests/ecs/run_task.rb +114 -0
  52. data/lib/fog/aws/requests/ecs/start_task.rb +130 -0
  53. data/lib/fog/aws/requests/ecs/stop_task.rb +64 -0
  54. data/lib/fog/aws/requests/ecs/update_service.rb +81 -0
  55. data/lib/fog/aws/version.rb +1 -1
  56. data/tests/requests/compute/vpc_tests.rb +7 -0
  57. data/tests/requests/ecs/cluster_tests.rb +112 -0
  58. data/tests/requests/ecs/container_instance_tests.rb +119 -0
  59. data/tests/requests/ecs/helper.rb +276 -0
  60. data/tests/requests/ecs/sample_task_definition1.json +56 -0
  61. data/tests/requests/ecs/service_tests.rb +132 -0
  62. data/tests/requests/ecs/task_definitions_tests.rb +97 -0
  63. data/tests/requests/ecs/task_tests.rb +145 -0
  64. metadata +59 -2
@@ -0,0 +1,68 @@
1
+ module Fog
2
+ module AWS
3
+ class ECS
4
+ class Real
5
+ require 'fog/aws/parsers/ecs/register_task_definition'
6
+
7
+ # Registers a new task definition from the supplied family and containerDefinitions.
8
+ # http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html
9
+ # ==== Parameters
10
+ # * containerDefinitions <~Array> - list of container definitions in JSON format that describe the different containers that make up your task.
11
+ # * family <~String> - family for a task definition, which allows you to track multiple versions of the same task definition.
12
+ # * volumes <~String> - list of volume definitions in JSON format that containers in your task may use.
13
+ # ==== Returns
14
+ # * response<~Excon::Response>:
15
+ # * body<~Hash>:
16
+ # * 'TaskDefinition' <~Array> - full task definition description registered
17
+ def register_task_definition(params={})
18
+ serialized_params = {}
19
+ params.each_pair do |k,v|
20
+ serialized_params.merge!(Fog::AWS.serialize_keys(k, v))
21
+ end
22
+ request({
23
+ 'Action' => 'RegisterTaskDefinition',
24
+ :parser => Fog::Parsers::AWS::ECS::RegisterTaskDefinition.new
25
+ }.merge(serialized_params))
26
+ end
27
+ end
28
+
29
+ class Mock
30
+ def register_task_definition(params={})
31
+ response = Excon::Response.new
32
+ response.status = 200
33
+
34
+ family_error = 'ClientException => Family can not be blank.'
35
+ container_error = 'ClientException => Container list cannot be empty.'
36
+ raise Fog::AWS::ECS::Error, family_error unless params['family']
37
+ raise Fog::AWS::ECS::Error, container_error unless params['containerDefinitions']
38
+
39
+ owner_id = Fog::AWS::Mock.owner_id
40
+ taskdef_name = params['family']
41
+ taskdef_rev = (1..9).to_a.shuffle.first
42
+ taskdef_path = "task-definition/#{taskdef_name}:#{taskdef_rev}"
43
+ taskdef_arn = Fog::AWS::Mock.arn('ecs', owner_id, taskdef_path, region)
44
+
45
+ task_definition = {
46
+ 'revision' => taskdef_rev,
47
+ 'taskDefinitionArn' => taskdef_arn,
48
+ 'family' => params['family'],
49
+ 'containerDefinitions' => params['containerDefinitions']
50
+ }
51
+ task_definition['volumes'] = params['volumes'] if params['volumes']
52
+
53
+ self.data[:task_definitions] << task_definition
54
+
55
+ response.body = {
56
+ 'ResponseMetadata' => {
57
+ 'RequestId' => Fog::AWS::Mock.request_id
58
+ },
59
+ 'RegisterTaskDefinitionResult' => {
60
+ 'taskDefinition' => task_definition
61
+ }
62
+ }
63
+ response
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,114 @@
1
+ module Fog
2
+ module AWS
3
+ class ECS
4
+ class Real
5
+ require 'fog/aws/parsers/ecs/run_task'
6
+
7
+ # Start a task using random placement and the default Amazon ECS scheduler.
8
+ # http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html
9
+ # ==== Parameters
10
+ # * cluster <~String> - short name or full Amazon Resource Name (ARN) of the cluster that you want to run your task on.
11
+ # * count <~Integer> - number of instantiations of the specified task that you would like to place on your cluster.
12
+ # * overrides <~Hash> - list of container overrides.
13
+ # * startedBy <~String> - optional tag specified when a task is started
14
+ # * taskDefinition <~String> - family and revision (family:revision) or full ARN of the task definition that you want to run.
15
+ # ==== Returns
16
+ # * response<~Excon::Response>:
17
+ # * body<~Hash>:
18
+ # * 'tasks' <~Array> - full description of the tasks that were run.
19
+ # * 'failures' <~Array> - Any failed tasks from your RunTask action are listed here.
20
+ def run_task(params={})
21
+ if overrides = params.delete('overrides')
22
+ serialized_overrides = {}
23
+ if overrides.is_a?(Hash)
24
+ overrides.each_pair do |k,v|
25
+ serialized_overrides.merge!(Fog::AWS.serialize_keys(k, v))
26
+ end
27
+ end
28
+ params.merge!('overrides' => serialized_overrides)
29
+ end
30
+
31
+ request({
32
+ 'Action' => 'RunTask',
33
+ :parser => Fog::Parsers::AWS::ECS::RunTask.new
34
+ }.merge(params))
35
+ end
36
+ end
37
+
38
+ class Mock
39
+ def run_task(params={})
40
+ response = Excon::Response.new
41
+ response.status = 200
42
+
43
+ unless task_def_id = params.delete('taskDefinition')
44
+ msg = 'ClientException => TaskDefinition cannot be empty.'
45
+ raise Fog::AWS::ECS::Error, msg
46
+ end
47
+
48
+ begin
49
+ result = describe_task_definition('taskDefinition' => task_def_id).body
50
+ task_def = result["DescribeTaskDefinitionResult"]["taskDefinition"]
51
+ task_def_arn = task_def["taskDefinitionArn"]
52
+ rescue Fog::AWS::ECS::Error => e
53
+ msg = 'ClientException => TaskDefinition not found.'
54
+ raise Fog::AWS::ECS::Error, msg
55
+ end
56
+
57
+ if %w(count overrides).any? { |k| params.has_key?(k) }
58
+ Fog::Logger.warning("you used parameters not mocked yet [light_black](#{caller.first})[/]")
59
+ Fog::Mock.not_implemented
60
+ end
61
+
62
+ cluster_id = params.delete('cluster') || 'default'
63
+ cluster_arn = nil
64
+ owner_id = Fog::AWS::Mock.owner_id
65
+
66
+ if cluster_id.match(/^arn:aws:ecs:.+:\d{1,12}:cluster\/(.+)$/)
67
+ cluster_arn = cluster_id
68
+ else
69
+ cluster_path = "cluster/#{cluster_id}"
70
+ cluster_arn = Fog::AWS::Mock.arn('ecs', owner_id, cluster_path, region)
71
+ end
72
+
73
+ task_path = "task/#{UUID.uuid}"
74
+ task_arn = Fog::AWS::Mock.arn('ecs', owner_id, task_path, region)
75
+ instance_path = "container-instance/#{UUID.uuid}"
76
+ container_instance_arn = Fog::AWS::Mock.arn('ecs', owner_id, instance_path, region)
77
+
78
+ containers = []
79
+ task_def["containerDefinitions"].each do |c|
80
+ container_path = "container/#{UUID.uuid}"
81
+ containers << {
82
+ 'name' => c['name'],
83
+ 'taskArn' => task_arn,
84
+ 'lastStatus' => 'PENDING',
85
+ 'containerArn' => Fog::AWS::Mock.arn('ecs', owner_id, container_path, region)
86
+ }
87
+ end
88
+
89
+ task = {
90
+ 'clusterArn' => cluster_arn,
91
+ 'desiredStatus' => 'RUNNING',
92
+ 'taskDefinitionArn' => task_def_arn,
93
+ 'lastStatus' => 'PENDING',
94
+ 'taskArn' => task_arn,
95
+ 'containerInstanceArn' => container_instance_arn,
96
+ 'containers' => containers
97
+ }
98
+ self.data[:tasks] << task
99
+
100
+ response.body = {
101
+ 'RunTaskResult' => {
102
+ 'failures' => [],
103
+ 'tasks' => [] << task
104
+ },
105
+ 'ResponseMetadata' => {
106
+ 'RequestId' => Fog::AWS::Mock.request_id
107
+ }
108
+ }
109
+ response
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,130 @@
1
+ module Fog
2
+ module AWS
3
+ class ECS
4
+ class Real
5
+ require 'fog/aws/parsers/ecs/start_task'
6
+
7
+ # Starts a new task from the specified task definition on the specified container instance or instances.
8
+ # http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_StartTask.html
9
+ # ==== Parameters
10
+ # * cluster <~String> - short name or full Amazon Resource Name (ARN) of the cluster that you want to start your task on.
11
+ # * containerInstances <~Array> - container instance UUIDs or full ARN entries for the container instances on which you would like to place your task.
12
+ # * overrides <~Hash> - list of container overrides.
13
+ # * startedBy <~String> - optional tag specified when a task is started
14
+ # * taskDefinition <~String> - family and revision (family:revision) or full ARN of the task definition that you want to start.
15
+ # ==== Returns
16
+ # * response<~Excon::Response>:
17
+ # * body<~Hash>:
18
+ # * 'tasks' <~Array> - full description of the tasks that were started.
19
+ # * 'failures' <~Array> - Any failed tasks from your StartTask action are listed here.
20
+ def start_task(params={})
21
+ if container_instances = params.delete('containerInstances')
22
+ params.merge!(Fog::AWS.indexed_param('containerInstances.member', [*container_instances]))
23
+ end
24
+
25
+ if overrides = params.delete('overrides')
26
+ serialized_overrides = {}
27
+ if overrides.is_a?(Hash)
28
+ overrides.each_pair do |k,v|
29
+ serialized_overrides.merge!(Fog::AWS.serialize_keys(k, v))
30
+ end
31
+ end
32
+ params.merge!('overrides' => serialized_overrides)
33
+ end
34
+
35
+ request({
36
+ 'Action' => 'StartTask',
37
+ :parser => Fog::Parsers::AWS::ECS::StartTask.new
38
+ }.merge(params))
39
+ end
40
+ end
41
+
42
+ class Mock
43
+ def start_task(params={})
44
+ response = Excon::Response.new
45
+ response.status = 200
46
+
47
+ unless task_def_id = params.delete('taskDefinition')
48
+ msg = 'ClientException => TaskDefinition cannot be empty.'
49
+ raise Fog::AWS::ECS::Error, msg
50
+ end
51
+
52
+ unless instances_id = params.delete('containerInstances')
53
+ msg = 'ClientException => Container instances cannot be empty.'
54
+ raise Fog::AWS::ECS::Error, msg
55
+ end
56
+
57
+ begin
58
+ result = describe_task_definition('taskDefinition' => task_def_id).body
59
+ task_def = result["DescribeTaskDefinitionResult"]["taskDefinition"]
60
+ task_def_arn = task_def["taskDefinitionArn"]
61
+ rescue Fog::AWS::ECS::Error => e
62
+ msg = 'ClientException => TaskDefinition not found.'
63
+ raise Fog::AWS::ECS::Error, msg
64
+ end
65
+
66
+ if %w(startedBy overrides).any? { |k| params.has_key?(k) }
67
+ Fog::Logger.warning("you used parameters not mocked yet [light_black](#{caller.first})[/]")
68
+ Fog::Mock.not_implemented
69
+ end
70
+
71
+ cluster_id = params.delete('cluster') || 'default'
72
+ cluster_arn = nil
73
+ owner_id = Fog::AWS::Mock.owner_id
74
+
75
+ if cluster_id.match(/^arn:aws:ecs:.+:\d{1,12}:cluster\/(.+)$/)
76
+ cluster_arn = cluster_id
77
+ else
78
+ cluster_path = "cluster/#{cluster_id}"
79
+ cluster_arn = Fog::AWS::Mock.arn('ecs', owner_id, cluster_path, region)
80
+ end
81
+
82
+ task_path = "task/#{UUID.uuid}"
83
+ task_arn = Fog::AWS::Mock.arn('ecs', owner_id, task_path, region)
84
+ instance_path = "container-instance/#{UUID.uuid}"
85
+
86
+ instance_id = [*instances_id].first
87
+ if instance_id.match(/^arn:aws:ecs:.+:\d{1,12}:container-instance\/(.+)$/)
88
+ container_instance_arn = instance_id
89
+ else
90
+ instance_path = "container-instance/#{instance_id}"
91
+ container_instance_arn = Fog::AWS::Mock.arn('ecs', owner_id, instance_path, region)
92
+ end
93
+
94
+ containers = []
95
+ task_def["containerDefinitions"].each do |c|
96
+ container_path = "container/#{UUID.uuid}"
97
+ containers << {
98
+ 'name' => c['name'],
99
+ 'taskArn' => task_arn,
100
+ 'lastStatus' => 'PENDING',
101
+ 'containerArn' => Fog::AWS::Mock.arn('ecs', owner_id, container_path, region)
102
+ }
103
+ end
104
+
105
+ task = {
106
+ 'clusterArn' => cluster_arn,
107
+ 'desiredStatus' => 'RUNNING',
108
+ 'taskDefinitionArn' => task_def_arn,
109
+ 'lastStatus' => 'PENDING',
110
+ 'taskArn' => task_arn,
111
+ 'containerInstanceArn' => container_instance_arn,
112
+ 'containers' => containers
113
+ }
114
+ self.data[:tasks] << task
115
+
116
+ response.body = {
117
+ 'StartTaskResult' => {
118
+ 'failures' => [],
119
+ 'tasks' => [] << task
120
+ },
121
+ 'ResponseMetadata' => {
122
+ 'RequestId' => Fog::AWS::Mock.request_id
123
+ }
124
+ }
125
+ response
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,64 @@
1
+ module Fog
2
+ module AWS
3
+ class ECS
4
+ class Real
5
+ require 'fog/aws/parsers/ecs/stop_task'
6
+
7
+ # Stops a running task.
8
+ # http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_StopTask.html
9
+ # ==== Parameters
10
+ # * cluster <~String> - short name or full Amazon Resource Name (ARN) of the cluster that hosts the task you want to stop.
11
+ # * task <~String> - task UUIDs or full Amazon Resource Name (ARN) entry of the task you would like to stop.
12
+ # ==== Returns
13
+ # * response<~Excon::Response>:
14
+ # * body<~Hash>:
15
+ # * 'Task' <~Hash> - The full description of the stopped task.
16
+ def stop_task(params={})
17
+ request({
18
+ 'Action' => 'StopTask',
19
+ :parser => Fog::Parsers::AWS::ECS::StopTask.new
20
+ }.merge(params))
21
+ end
22
+ end
23
+
24
+ class Mock
25
+ def stop_task(params={})
26
+ response = Excon::Response.new
27
+ response.status = 200
28
+
29
+ unless task_id = params.delete('task')
30
+ msg = "InvalidParameterException => Task can not be blank."
31
+ raise Fog::AWS::ECS::Error, msg
32
+ end
33
+
34
+ if cluster = params.delete('cluster')
35
+ Fog::Logger.warning("you used parameters not mocked yet [light_black](#{caller.first})[/]")
36
+ end
37
+
38
+ if match = task_id.match(/^arn:aws:ecs:.+:\d{1,12}:task\/(.+)$/)
39
+ i = self.data[:tasks].index { |t| t['taskArn'].eql?(task_id) }
40
+ else
41
+ i = self.data[:tasks].index { |t| t['taskArn'].match(/#{task_id}$/) }
42
+ end
43
+
44
+ msg = "ClientException => The referenced task was not found."
45
+ raise Fog::AWS::ECS::Error, msg unless i
46
+
47
+ task = self.data[:tasks][i]
48
+ task['desiredStatus'] = 'STOPPED'
49
+ self.data[:tasks].delete_at(i)
50
+
51
+ response.body = {
52
+ 'StopTaskResult' => {
53
+ 'task' => task
54
+ },
55
+ 'ResponseMetadata' => {
56
+ 'RequestId' => Fog::AWS::Mock.request_id
57
+ }
58
+ }
59
+ response
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,81 @@
1
+ module Fog
2
+ module AWS
3
+ class ECS
4
+ class Real
5
+ require 'fog/aws/parsers/ecs/update_service'
6
+
7
+ # Modify the desired count or task definition used in a service.
8
+ # http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html
9
+ # ==== Parameters
10
+ # * cluster <~String> - short name or full Amazon Resource Name (ARN) of the cluster that your service is running on.
11
+ # * desiredCount <~Integer> - number of instantiations of the task that you would like to place and keep running in your service.
12
+ # * service <~String> - name of the service that you want to update.
13
+ # * taskDefinition <~String> - family and revision (family:revision) or full Amazon Resource Name (ARN) of the task definition that you want to run in your service.
14
+ # ==== Returns
15
+ # * response<~Excon::Response>:
16
+ # * body<~Hash>:
17
+ # * 'Service'<~Hash> - The full description of the updated cluster
18
+ def update_service(params={})
19
+ request({
20
+ 'Action' => 'UpdateService',
21
+ :parser => Fog::Parsers::AWS::ECS::UpdateService.new
22
+ }.merge(params))
23
+ end
24
+ end
25
+
26
+ class Mock
27
+ def update_service(params={})
28
+ response = Excon::Response.new
29
+ response.status = 200
30
+
31
+ service_id = params.delete('service')
32
+ msg = 'ClientException => Service cannot be empty.'
33
+ raise Fog::AWS::ECS::Error, msg unless service_id
34
+
35
+ owner_id = Fog::AWS::Mock.owner_id
36
+
37
+ cluster = params.delete('cluster') || 'default'
38
+ if !cluster.match(/^arn:aws:ecs:.+:.+:cluster\/(.+)$/)
39
+ cluster_path = "cluster/#{cluster}"
40
+ cluster_arn = Fog::AWS::Mock.arn('ecs', owner_id, cluster_path, region)
41
+ else
42
+ cluster_arn = cluster
43
+ end
44
+
45
+ if match = service_id.match(/^arn:aws:ecs:.+:\d{1,12}:service\/(.+)$/)
46
+ i = self.data[:services].index do |s|
47
+ s['clusterArn'].eql?(cluster_arn) && s['serviceArn'].eql?(service_id)
48
+ end
49
+ else
50
+ i = self.data[:services].index do |s|
51
+ s['clusterArn'].eql?(cluster_arn) && s['serviceName'].eql?(service_id)
52
+ end
53
+ end
54
+
55
+ msg = "ServiceNotFoundException => Service not found."
56
+ raise Fog::AWS::ECS::Error, msg unless i
57
+
58
+ service = self.data[:services][i]
59
+
60
+ if desired_count = params.delete('desiredCount')
61
+ # ignore
62
+ end
63
+
64
+ if task_definition = params.delete('taskDefinition')
65
+ service['taskDefinition'] = task_definition
66
+ end
67
+
68
+ response.body = {
69
+ 'UpdateServiceResult' => {
70
+ 'service' => service
71
+ },
72
+ 'ResponseMetadata' => {
73
+ 'RequestId' => Fog::AWS::Mock.request_id
74
+ }
75
+ }
76
+ response
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end