Module: AceClient::Niftycloud::Computing

Defined in:
lib/ace-client/niftycloud/computing.rb

Constant Summary collapse

DEFAULT_STOP_INSTANCES_TIMEOUT =
60*30
DEFAULT_STOP_INSTANCES_SLEEP =
5
DEFAULT_DELETE_INSTANCES_TIMEOUT =
60*30
DEFAULT_DELETE_INSTANCES_SLEEP =
5

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.build_client(options = {}) ⇒ Object



10
11
12
13
14
15
16
17
18
19
# File 'lib/ace-client/niftycloud/computing.rb', line 10

def build_client(options={})
  options = options.merge(
    :before_signature => lambda {|params|
      params['AccessKeyId'] = params.delete('AWSAccessKeyId')
    }
  )
  client = AceClient::Query2.new(options)
  client.extend(AceClient::Niftycloud::Computing)
  client
end

Instance Method Details

#delete_imagesObject



167
168
169
170
171
172
173
# File 'lib/ace-client/niftycloud/computing.rb', line 167

def delete_images
  self.images.each do |image|
    if image['imageOwnerId'] == 'self'
      self.action('DeleteImage', 'ImageId' => image['imageId'])
    end
  end
end

#delete_instances(options = {}) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/ace-client/niftycloud/computing.rb', line 81

def delete_instances(options={})
  options[:timeout] ||= DEFAULT_DELETE_INSTANCES_TIMEOUT
  options[:sleep] ||= DEFAULT_DELETE_INSTANCES_SLEEP

  timeout(options[:timeout]) do
    until instances.empty? do
      instances.each do |instance|
        response = self.action('DescribeInstanceAttribute', {'InstanceId' => instance['instanceId'], 'Attribute' => 'disableApiTermination'})
        if response['DescribeInstanceAttributeResponse']['disableApiTermination']['value'] == 'true'
          self.action('ModifyInstanceAttribute', {'InstanceId' => instance['instanceId'], 'Attribute' => 'disableApiTermination', 'Value' => 'false'})
        end
        self.action('TerminateInstances', {'InstanceId.1' => instance['instanceId']})
      end
      uploads.each do |upload|
        self.action('CancelUpload', {'ConversionTaskId' => upload['conversionTaskId']})
      end
      sleep options[:sleep]
    end
  end
end

#delete_key_pairsObject



102
103
104
105
106
# File 'lib/ace-client/niftycloud/computing.rb', line 102

def delete_key_pairs
  key_pairs.each do |key_pair|
    self.action('DeleteKeyPair', {'KeyName' => key_pair['keyName']})
  end
end

#delete_load_balancersObject



152
153
154
155
156
157
158
159
# File 'lib/ace-client/niftycloud/computing.rb', line 152

def delete_load_balancers
  self.load_balancers.each do |lb|
    name = lb['LoadBalancerName']
    port = lb['ListenerDescriptions']['member']['Listener']['LoadBalancerPort']
    instance_port = lb['ListenerDescriptions']['member']['Listener']['InstancePort']
    self.action('DeleteLoadBalancer', 'LoadBalancerName' => name, 'LoadBalancerPort' => port, 'InstancePort' => instance_port)
  end
end

#delete_resources(options = {}) ⇒ Object



181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/ace-client/niftycloud/computing.rb', line 181

def delete_resources(options={})
  stop_instances(
    timeout: options[:stop_instances_timeout],
    sleep: options[:stop_instances_sleep]
  )
  delete_instances(
    timeout: options[:delete_instances_timeout],
    sleep: options[:delete_instances_sleep]
  )
  delete_key_pairs
  delete_security_group_rules
  delete_security_groups
  delete_load_balancers
  delete_volumes
  delete_images
  delete_ssl_certificates
end

#delete_security_group_rulesObject



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/ace-client/niftycloud/computing.rb', line 121

def delete_security_group_rules
  security_groups.each do |group|
    rules = [group['ipPermissions']['item']].flatten rescue []
    next if rules.empty?
    rules.each do |rule|
      hash = {}
      hash["IpPermissions.1.IpProtocol"] = rule['ipProtocol']
      hash["IpPermissions.1.FromPort"] = rule['fromPort'] if rule['fromPort']
      hash["IpPermissions.1.ToPort"] = rule['toPort'] if rule['toPort']
      hash["IpPermissions.1.InOut"] = rule['inOut'] if rule['inOut']
      if rule.key?('ipRanges')
        hash["IpPermissions.1.IpRanges.1.CidrIp"] = rule['ipRanges']['item']['cidrIp'] # TODO: can't delete cidr ip rules
      elsif rule.key?('groups')
        hash["IpPermissions.1.Groups.1.GroupName"] = rule['groups']['item']['groupName']
      end
      hash['GroupName'] = group['groupName']
      self.action('RevokeSecurityGroupIngress', hash)
      wait_security_group_status(group['groupName'], 'applied')
    end
  end
end

#delete_security_groupsObject



143
144
145
146
147
148
149
150
# File 'lib/ace-client/niftycloud/computing.rb', line 143

def delete_security_groups
  until security_groups.empty? do
    security_groups.each do |group|
      self.action('DeleteSecurityGroup', 'GroupName' => group['groupName'])
    end
    sleep 5
  end
end

#delete_ssl_certificatesObject



175
176
177
178
179
# File 'lib/ace-client/niftycloud/computing.rb', line 175

def delete_ssl_certificates
  self.ssl_certificates.each do |sc|
    self.action('DeleteSslCertificate', 'FqdnId' => sc['fqdnId'])
  end
end

#delete_volumesObject



161
162
163
164
165
# File 'lib/ace-client/niftycloud/computing.rb', line 161

def delete_volumes
  self.volumes.each do |volume|
    self.action('DeleteVolume', 'VolumeId' => volume['volumeId'])
  end
end

#find_instance_by_id(instance_id) ⇒ Object



60
61
62
63
# File 'lib/ace-client/niftycloud/computing.rb', line 60

def find_instance_by_id(instance_id)
  response = self.action('DescribeInstances', {'InstanceId.1' => instance_id})
  response['DescribeInstancesResponse']['reservationSet']['item']['instancesSet']['item'] rescue nil
end

#find_security_group_by_name(name) ⇒ Object



108
109
110
111
# File 'lib/ace-client/niftycloud/computing.rb', line 108

def find_security_group_by_name(name)
  response = self.action('DescribeSecurityGroups', {'GroupName.1' => name})
  response['DescribeSecurityGroupsResponse']['securityGroupInfo']['item'] rescue nil
end

#instancesObject



21
22
23
24
25
26
27
28
29
# File 'lib/ace-client/niftycloud/computing.rb', line 21

def instances
  response = self.action('DescribeInstances', {})
  begin
    items = [response['DescribeInstancesResponse']['reservationSet']['item']].flatten
    items.map{|item| item['instancesSet']['item'] }.flatten
  rescue
    []
  end
end

#items(options) ⇒ Object



31
32
33
34
# File 'lib/ace-client/niftycloud/computing.rb', line 31

def items(options)
   response = self.action(options[:action], {})
   [response[options[:action] + 'Response'][options[:key]]['item']].flatten rescue []
end

#load_balancersObject



52
53
54
55
# File 'lib/ace-client/niftycloud/computing.rb', line 52

def load_balancers
  response = self.action('DescribeLoadBalancers', {})
  [response['DescribeLoadBalancersResponse']['DescribeLoadBalancersResult']['LoadBalancerDescriptions']['member']].flatten rescue []
end

#security_group_rulesObject



57
58
# File 'lib/ace-client/niftycloud/computing.rb', line 57

def security_group_rules
end

#stop_instances(options = {}) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/ace-client/niftycloud/computing.rb', line 65

def stop_instances(options={})
  options[:timeout] ||= DEFAULT_STOP_INSTANCES_TIMEOUT
  options[:sleep] ||= DEFAULT_STOP_INSTANCES_SLEEP

  timeout(options[:timeout]) do
    until instances.all? {|instance| instance['instanceState']['name'] != 'running'} || instances.empty? do
      instances.each do |instance|
        if instance['instanceState']['name'] != 'stopped'
          self.action('StopInstances', {'InstanceId.1' => instance['instanceId']})
        end
      end
      sleep options[:sleep]
    end
  end
end

#wait_security_group_status(name, status) ⇒ Object



113
114
115
116
117
118
119
# File 'lib/ace-client/niftycloud/computing.rb', line 113

def wait_security_group_status(name, status)
  loop do
    group = find_security_group_by_name(name)
    break if group['groupStatus'] == status
    sleep 1
  end
end