mystro-common 0.1.11 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +42 -4
- data/Gemfile +7 -1
- data/Rakefile +137 -1
- data/lib/{mystro/ext/fog → fog/ext}/balancer.rb +0 -0
- data/lib/fog/ext/dynect/dns.rb +140 -0
- data/lib/fog/ext/dynect/models/dns/record.rb +66 -0
- data/lib/fog/ext/dynect/models/dns/records.rb +87 -0
- data/lib/fog/ext/dynect/models/dns/zone.rb +60 -0
- data/lib/fog/ext/dynect/models/dns/zones.rb +29 -0
- data/lib/fog/ext/dynect/requests/dns/delete_record.rb +56 -0
- data/lib/fog/ext/dynect/requests/dns/delete_zone.rb +42 -0
- data/lib/fog/ext/dynect/requests/dns/get_all_records.rb +56 -0
- data/lib/fog/ext/dynect/requests/dns/get_node_list.rb +56 -0
- data/lib/fog/ext/dynect/requests/dns/get_record.rb +85 -0
- data/lib/fog/ext/dynect/requests/dns/get_zone.rb +58 -0
- data/lib/fog/ext/dynect/requests/dns/post_record.rb +72 -0
- data/lib/fog/ext/dynect/requests/dns/post_session.rb +44 -0
- data/lib/fog/ext/dynect/requests/dns/post_zone.rb +71 -0
- data/lib/fog/ext/dynect/requests/dns/put_zone.rb +76 -0
- data/lib/fog/ext/dynect.rb +26 -0
- data/lib/mystro/cloud/action.rb +22 -0
- data/lib/mystro/cloud/connect/aws/balancer.rb +55 -0
- data/lib/mystro/cloud/connect/aws/compute.rb +151 -0
- data/lib/mystro/cloud/connect/aws/listener.rb +36 -0
- data/lib/mystro/cloud/connect/aws/record.rb +58 -0
- data/lib/mystro/cloud/connect/aws/zone.rb +35 -0
- data/lib/mystro/cloud/connect/aws.rb +14 -0
- data/lib/mystro/cloud/connect/dynect/record.rb +72 -0
- data/lib/mystro/cloud/connect/dynect/zone.rb +35 -0
- data/lib/mystro/cloud/connect/dynect.rb +17 -0
- data/lib/mystro/cloud/connect/fog.rb +66 -0
- data/lib/mystro/cloud/connect.rb +64 -0
- data/lib/mystro/cloud/model/balancer.rb +15 -0
- data/lib/mystro/cloud/model/compute.rb +27 -0
- data/lib/mystro/cloud/model/listener.rb +30 -0
- data/lib/mystro/cloud/model/record.rb +20 -0
- data/lib/mystro/cloud/model/volume.rb +12 -0
- data/lib/mystro/cloud/model/zone.rb +9 -0
- data/lib/mystro/cloud/model.rb +183 -0
- data/lib/mystro/cloud.rb +32 -0
- data/lib/mystro/common/version.rb +4 -3
- data/lib/mystro/dsl/balancer.rb +18 -0
- data/lib/mystro/dsl/compute.rb +57 -0
- data/lib/mystro/dsl/health.rb +7 -0
- data/lib/mystro/dsl/listener.rb +5 -0
- data/lib/mystro/dsl/oldtemplate.rb +281 -0
- data/lib/mystro/dsl/template.rb +12 -278
- data/lib/mystro/dsl/template_file.rb +18 -0
- data/lib/mystro/dsl/volume.rb +8 -0
- data/lib/mystro/dsl.rb +40 -0
- data/lib/mystro/organization.rb +83 -0
- data/lib/mystro/plugin.rb +4 -3
- data/lib/mystro/provider.rb +40 -0
- data/lib/mystro/userdata.rb +1 -1
- data/lib/mystro-common.rb +32 -31
- data/mystro-common.gemspec +2 -1
- data/spec/cloud/aws/balancer_spec.rb +10 -0
- data/spec/cloud/aws/compute_spec.rb +10 -0
- data/spec/cloud/aws/record_spec.rb +10 -0
- data/spec/cloud/dynect/record_spec.rb +10 -0
- data/spec/model/compute_spec.rb +36 -0
- data/spec/model/model_spec.rb +89 -0
- data/spec/model/record_spec.rb +27 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/support/balancer.rb +49 -0
- data/spec/support/compute.rb +65 -0
- data/spec/support/record.rb +45 -0
- data/test/config.yml +71 -0
- metadata +99 -14
- data/lib/mystro/account.rb +0 -105
- data/lib/mystro/connect/balancer.rb +0 -91
- data/lib/mystro/connect/compute.rb +0 -100
- data/lib/mystro/connect/dns.rb +0 -51
- data/lib/mystro/connect/environment.rb +0 -31
- data/lib/mystro/connect.rb +0 -124
- data/lib/mystro/job.rb +0 -0
- data/lib/mystro/model.rb +0 -71
@@ -0,0 +1,42 @@
|
|
1
|
+
module Fog
|
2
|
+
module DNS
|
3
|
+
class Dynect
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Delete a zone
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * zone<~String> - zone to host
|
10
|
+
|
11
|
+
def delete_zone(zone)
|
12
|
+
request(
|
13
|
+
:expects => 200,
|
14
|
+
:method => :delete,
|
15
|
+
:path => "Zone/#{zone}"
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Mock
|
21
|
+
def delete_zone(zone)
|
22
|
+
self.data[:zones].delete(zone)
|
23
|
+
|
24
|
+
response = Excon::Response.new
|
25
|
+
response.status = 200
|
26
|
+
response.body = {
|
27
|
+
"status" => "success",
|
28
|
+
"data" => {},
|
29
|
+
"job_id" => Fog::Dynect::Mock.job_id,
|
30
|
+
"msgs" => [{
|
31
|
+
"ERR_CD" => '',
|
32
|
+
"INFO" => '',
|
33
|
+
"LVL" => '',
|
34
|
+
"SOURCE" => ''
|
35
|
+
}]
|
36
|
+
}
|
37
|
+
response
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Fog
|
2
|
+
module DNS
|
3
|
+
class Dynect
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Get one or more node lists
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * zone<~String> - zone to lookup node lists for
|
10
|
+
# * options<~Hash>
|
11
|
+
# * fqdn<~String> - fully qualified domain name of node to lookup
|
12
|
+
|
13
|
+
def get_all_records(zone, options = {})
|
14
|
+
requested_fqdn = options['fqdn'] || options[:fqdn]
|
15
|
+
request(
|
16
|
+
:expects => 200,
|
17
|
+
:idempotent => true,
|
18
|
+
:method => :get,
|
19
|
+
:path => ['AllRecord', zone, requested_fqdn].compact.join('/')
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Mock
|
25
|
+
def get_all_records(zone, options = {})
|
26
|
+
raise Fog::DNS::Dynect::NotFound unless zone = self.data[:zones][zone]
|
27
|
+
|
28
|
+
response = Excon::Response.new
|
29
|
+
response.status = 200
|
30
|
+
|
31
|
+
data = [zone[:zone]]
|
32
|
+
|
33
|
+
if fqdn = options[:fqdn]
|
34
|
+
data = data | zone[:records].collect { |type, records| records.select { |record| record[:fqdn] == fqdn } }.flatten.compact
|
35
|
+
else
|
36
|
+
data = data | zone[:records].collect { |type, records| records.collect { |record| record[:fqdn] } }.flatten
|
37
|
+
end
|
38
|
+
|
39
|
+
response.body = {
|
40
|
+
"status" => "success",
|
41
|
+
"data" => data,
|
42
|
+
"job_id" => Fog::Dynect::Mock.job_id,
|
43
|
+
"msgs" => [{
|
44
|
+
"INFO" => "get_tree: Here is your zone tree",
|
45
|
+
"SOURCE" => "BLL",
|
46
|
+
"ERR_CD" => nil,
|
47
|
+
"LVL" => "INFO"
|
48
|
+
}]
|
49
|
+
}
|
50
|
+
|
51
|
+
response
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Fog
|
2
|
+
module DNS
|
3
|
+
class Dynect
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Get one or more node lists
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * zone<~String> - zone to lookup node lists for
|
10
|
+
# * options<~Hash>
|
11
|
+
# * fqdn<~String> - fully qualified domain name of node to lookup
|
12
|
+
|
13
|
+
def get_node_list(zone, options = {})
|
14
|
+
requested_fqdn = options['fqdn'] || options[:fqdn]
|
15
|
+
request(
|
16
|
+
:expects => 200,
|
17
|
+
:idempotent => true,
|
18
|
+
:method => :get,
|
19
|
+
:path => ['AllRecord', zone, requested_fqdn].compact.join('/')
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Mock
|
25
|
+
def get_node_list(zone, options = {})
|
26
|
+
raise Fog::DNS::Dynect::NotFound unless zone = self.data[:zones][zone]
|
27
|
+
|
28
|
+
response = Excon::Response.new
|
29
|
+
response.status = 200
|
30
|
+
|
31
|
+
data = [zone[:zone]]
|
32
|
+
|
33
|
+
if fqdn = options[:fqdn]
|
34
|
+
data = data | zone[:records].collect { |type, records| records.select { |record| record[:fqdn] == fqdn } }.flatten.compact
|
35
|
+
else
|
36
|
+
data = data | zone[:records].collect { |type, records| records.collect { |record| record[:fqdn] } }.flatten
|
37
|
+
end
|
38
|
+
|
39
|
+
response.body = {
|
40
|
+
"status" => "success",
|
41
|
+
"data" => data,
|
42
|
+
"job_id" => Fog::Dynect::Mock.job_id,
|
43
|
+
"msgs" => [{
|
44
|
+
"INFO" => "get_tree: Here is your zone tree",
|
45
|
+
"SOURCE" => "BLL",
|
46
|
+
"ERR_CD" => nil,
|
47
|
+
"LVL" => "INFO"
|
48
|
+
}]
|
49
|
+
}
|
50
|
+
|
51
|
+
response
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Fog
|
2
|
+
module DNS
|
3
|
+
class Dynect
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# List records of a given type
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * type<~String> - type of record in ['AAAA', 'ANY', 'A', 'CNAME', 'DHCID', 'DNAME', 'DNSKEY', 'DS', 'KEY', 'LOC', 'MX', 'NSA', 'NS', 'PTR', 'PX', 'RP', 'SOA', 'SPF', 'SRV', 'SSHFP', 'TXT']
|
10
|
+
# * zone<~String> - name of zone to lookup
|
11
|
+
# * fqdn<~String> - name of fqdn to lookup
|
12
|
+
# * options<~Hash>:
|
13
|
+
# * record_id<~String> - id of record
|
14
|
+
|
15
|
+
def get_record(type, zone, fqdn, options = {})
|
16
|
+
path = ["#{type.to_s.upcase}Record", zone, fqdn, options['record_id']].compact.join('/')
|
17
|
+
request(
|
18
|
+
:expects => 200,
|
19
|
+
:idempotent => true,
|
20
|
+
:method => :get,
|
21
|
+
:path => path
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Mock
|
27
|
+
def get_record(type, zone, fqdn, options = {})
|
28
|
+
raise ArgumentError unless [
|
29
|
+
'AAAA', 'ANY', 'A', 'CNAME',
|
30
|
+
'DHCID', 'DNAME', 'DNSKEY',
|
31
|
+
'DS', 'KEY', 'LOC', 'MX',
|
32
|
+
'NSA', 'NS', 'PTR', 'PX',
|
33
|
+
'RP', 'SOA', 'SPF', 'SRV',
|
34
|
+
'SSHFP', 'TXT'
|
35
|
+
].include? type
|
36
|
+
raise Fog::DNS::Dynect::NotFound unless zone = self.data[:zones][zone]
|
37
|
+
|
38
|
+
response = Excon::Response.new
|
39
|
+
response.status = 200
|
40
|
+
|
41
|
+
if record_id = options['record_id']
|
42
|
+
raise Fog::DNS::Dynect::NotFound unless record = zone[:records][type].find { |record| record[:record_id] == record_id.to_i }
|
43
|
+
response.body = {
|
44
|
+
"status" => "success",
|
45
|
+
"data" => {
|
46
|
+
"zone" => record[:zone][:zone],
|
47
|
+
"ttl" => record[:ttl],
|
48
|
+
"fqdn" => record[:fqdn],
|
49
|
+
"record_type" => type,
|
50
|
+
"rdata" => record[:rdata],
|
51
|
+
"record_id" => record[:record_id]
|
52
|
+
},
|
53
|
+
"job_id" => Fog::Dynect::Mock.job_id,
|
54
|
+
"msgs" => [{
|
55
|
+
"INFO" => "get: Found the record",
|
56
|
+
"SOURCE" => "API-B",
|
57
|
+
"ERR_CD" => nil,
|
58
|
+
"LVL" => "INFO"
|
59
|
+
}]
|
60
|
+
}
|
61
|
+
else
|
62
|
+
records = if type == "ANY"
|
63
|
+
zone[:records].values.flatten.select { |record| record[:fqdn] == fqdn }
|
64
|
+
else
|
65
|
+
zone[:records][type].select { |record| record[:fqdn] == fqdn }
|
66
|
+
end
|
67
|
+
response.body = {
|
68
|
+
"status" => "success",
|
69
|
+
"data" => records.collect { |record| "/REST/#{record[:type]}Record/#{record[:zone][:zone]}/#{record[:fqdn]}/#{record[:record_id]}" },
|
70
|
+
"job_id" => Fog::Dynect::Mock.job_id,
|
71
|
+
"msgs" => [{
|
72
|
+
"INFO" => "detail: Found #{records.size} record",
|
73
|
+
"SOURCE" => "BLL",
|
74
|
+
"ERR_CD" => nil,
|
75
|
+
"LVL" => "INFO"
|
76
|
+
}]
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
response
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Fog
|
2
|
+
module DNS
|
3
|
+
class Dynect
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Get one or more zones
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * options<~Hash>:
|
10
|
+
# * zone<~String> - name of zone to lookup, or omit to return list of zones
|
11
|
+
|
12
|
+
def get_zone(options = {})
|
13
|
+
request(
|
14
|
+
:expects => 200,
|
15
|
+
:idempotent => true,
|
16
|
+
:method => :get,
|
17
|
+
:path => ['Zone', options['zone']].compact.join('/')
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Mock
|
23
|
+
def get_zone(options = {})
|
24
|
+
if options['zone']
|
25
|
+
raise Fog::DNS::Dynect::NotFound unless zone = self.data[:zones][options['zone']]
|
26
|
+
data = {
|
27
|
+
"zone_type" => zone[:zone_type],
|
28
|
+
"serial_style" => zone[:serial_style],
|
29
|
+
"serial" => zone[:serial],
|
30
|
+
"zone" => zone[:zone]
|
31
|
+
}
|
32
|
+
info = "get: Your zone, #{zone[:zone]}"
|
33
|
+
else
|
34
|
+
data = self.data[:zones].collect { |zone, data| "/REST/Zone/#{zone}/" }
|
35
|
+
info = "get: Your #{data.size} zones"
|
36
|
+
end
|
37
|
+
|
38
|
+
response = Excon::Response.new
|
39
|
+
response.status = 200
|
40
|
+
|
41
|
+
response.body = {
|
42
|
+
"status" => "success",
|
43
|
+
"data" => data,
|
44
|
+
"job_id" => Fog::Dynect::Mock.job_id,
|
45
|
+
"msgs" => [{
|
46
|
+
"INFO" => info,
|
47
|
+
"SOURCE" => "BLL",
|
48
|
+
"ERR_CD" => nil,
|
49
|
+
"LVL" => "INFO"
|
50
|
+
}]
|
51
|
+
}
|
52
|
+
|
53
|
+
response
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Fog
|
2
|
+
module DNS
|
3
|
+
class Dynect
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Create a record
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * type<~String> - type of record in ['AAAA', 'ANY', 'A', 'CNAME', 'DHCID', 'DNAME', 'DNSKEY', 'DS', 'KEY', 'LOC', 'MX', 'NSA', 'NS', 'PTR', 'PX', 'RP', 'SOA', 'SPF', 'SRV', 'SSHFP', 'TXT']
|
10
|
+
# * zone<~String> - zone of record
|
11
|
+
# * rdata<~Hash> - rdata for record
|
12
|
+
# * options<~Hash>: (options vary by type, listing below includes common parameters)
|
13
|
+
# * ttl<~Integer> - ttl for the record, defaults to zone ttl
|
14
|
+
|
15
|
+
def post_record(type, zone, fqdn, rdata, options = {})
|
16
|
+
options.merge!('rdata' => rdata)
|
17
|
+
request(
|
18
|
+
:body => Fog::JSON.encode(options),
|
19
|
+
:expects => 200,
|
20
|
+
:method => :post,
|
21
|
+
:path => ["#{type.to_s.upcase}Record", zone, fqdn].join('/')
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Mock
|
27
|
+
def post_record(type, zone, fqdn, rdata, options = {})
|
28
|
+
raise Fog::DNS::Dynect::NotFound unless zone = self.data[:zones][zone]
|
29
|
+
|
30
|
+
records = zone[:records]
|
31
|
+
record_id = zone[:next_record_id]
|
32
|
+
zone[:next_record_id] += 1
|
33
|
+
|
34
|
+
record = {
|
35
|
+
:type => type,
|
36
|
+
:zone => zone,
|
37
|
+
:fqdn => fqdn,
|
38
|
+
:rdata => rdata,
|
39
|
+
:ttl => options[:ttl] || zone[:ttl],
|
40
|
+
:record_id => record_id
|
41
|
+
}
|
42
|
+
|
43
|
+
records[type] << record
|
44
|
+
|
45
|
+
response = Excon::Response.new
|
46
|
+
response.status = 200
|
47
|
+
|
48
|
+
response.body = {
|
49
|
+
"status" => "success",
|
50
|
+
"data" => {
|
51
|
+
"zone" => record[:zone][:zone],
|
52
|
+
"ttl" => record[:ttl],
|
53
|
+
"fqdn" => record[:fqdn],
|
54
|
+
"record_type" => record[:type],
|
55
|
+
"rdata" => record[:rdata],
|
56
|
+
"record_id" => record[:record_id]
|
57
|
+
},
|
58
|
+
"job_id" => Fog::Dynect::Mock.job_id,
|
59
|
+
"msgs" => [{
|
60
|
+
"INFO"=>"add: Record added",
|
61
|
+
"SOURCE"=>"BLL",
|
62
|
+
"ERR_CD"=>nil,
|
63
|
+
"LVL"=>"INFO"
|
64
|
+
}]
|
65
|
+
}
|
66
|
+
|
67
|
+
response
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Fog
|
2
|
+
module DNS
|
3
|
+
class Dynect
|
4
|
+
class Real
|
5
|
+
|
6
|
+
def post_session
|
7
|
+
request(
|
8
|
+
:expects => 200,
|
9
|
+
:idempotent => true,
|
10
|
+
:method => :post,
|
11
|
+
:path => "Session",
|
12
|
+
:body => Fog::JSON.encode({
|
13
|
+
:customer_name => @dynect_customer,
|
14
|
+
:user_name => @dynect_username,
|
15
|
+
:password => @dynect_password
|
16
|
+
})
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Mock
|
22
|
+
def post_session
|
23
|
+
response = Excon::Response.new
|
24
|
+
response.status = 200
|
25
|
+
response.body = {
|
26
|
+
"status" => "success",
|
27
|
+
"data" => {
|
28
|
+
"token" => auth_token,
|
29
|
+
"version" => Fog::Dynect::Mock.version
|
30
|
+
},
|
31
|
+
"job_id" => Fog::Dynect::Mock.job_id,
|
32
|
+
"msgs"=>[{
|
33
|
+
"INFO"=>"login: Login successful",
|
34
|
+
"SOURCE"=>"BLL",
|
35
|
+
"ERR_CD"=>nil,
|
36
|
+
"LVL"=>"INFO"
|
37
|
+
}]
|
38
|
+
}
|
39
|
+
response
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Fog
|
2
|
+
module DNS
|
3
|
+
class Dynect
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Create a zone
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * rname<~String> - administrative contact
|
10
|
+
# * ttl<~Integer> - time to live (in seconds) for records in this zone
|
11
|
+
# * zone<~String> - name of zone to host
|
12
|
+
# * options<~Hash>:
|
13
|
+
# * serial_style<~String> - style of serial number, in ['day', 'epoch', 'increment', 'minute']. Defaults to increment
|
14
|
+
|
15
|
+
def post_zone(rname, ttl, zone, options = {})
|
16
|
+
body = Fog::JSON.encode({
|
17
|
+
:rname => rname,
|
18
|
+
:token => auth_token,
|
19
|
+
:ttl => ttl
|
20
|
+
}.merge!(options))
|
21
|
+
|
22
|
+
request(
|
23
|
+
:body => body,
|
24
|
+
:expects => 200,
|
25
|
+
:method => :post,
|
26
|
+
:path => 'Zone/' << zone
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class Mock
|
32
|
+
def post_zone(rname, ttl, zone, options = {})
|
33
|
+
new_zone = self.data[:zones][zone] = {
|
34
|
+
:next_record_id => 0,
|
35
|
+
:records => Hash.new do |records_hash, type|
|
36
|
+
records_hash[type] = []
|
37
|
+
end,
|
38
|
+
:records_to_delete => [],
|
39
|
+
:rname => rname,
|
40
|
+
:serial_style => options[:serial_style] || "increment",
|
41
|
+
:serial => 0,
|
42
|
+
:ttl => ttl,
|
43
|
+
:zone => zone,
|
44
|
+
:zone_type => "Primary"
|
45
|
+
}
|
46
|
+
|
47
|
+
response = Excon::Response.new
|
48
|
+
response.status = 200
|
49
|
+
response.body = {
|
50
|
+
"status" => "success",
|
51
|
+
"data" => {
|
52
|
+
"zone_type" => new_zone[:zone_type],
|
53
|
+
"serial_style" => new_zone[:serial_style],
|
54
|
+
"serial" => new_zone[:serial],
|
55
|
+
"zone" => zone
|
56
|
+
},
|
57
|
+
"job_id" => Fog::Dynect::Mock.job_id,
|
58
|
+
"msgs" => [{
|
59
|
+
"INFO" => "create: New zone #{zone} created. Publish it to put it on our server.",
|
60
|
+
"SOURCE" => "BLL",
|
61
|
+
"ERR_CD" => nil,
|
62
|
+
"LVL" => "INFO"
|
63
|
+
}]
|
64
|
+
}
|
65
|
+
|
66
|
+
response
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Fog
|
2
|
+
module DNS
|
3
|
+
class Dynect
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Update a zone
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * zone<~String> - name or id of zone
|
10
|
+
# * options<~Hash>:
|
11
|
+
# * freeze<~Boolean> - causes zone to become frozen
|
12
|
+
# * publish<~Boolean> - causes all pending changes to be pushed to nameservers
|
13
|
+
# * thaw<~Boolean> - causes zone to cease being frozen
|
14
|
+
|
15
|
+
def put_zone(zone, options = {})
|
16
|
+
request(
|
17
|
+
:body => Fog::JSON.encode(options),
|
18
|
+
:expects => 200,
|
19
|
+
:method => :put,
|
20
|
+
:path => 'Zone/' << zone
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Mock
|
26
|
+
def put_zone(zone, options = {})
|
27
|
+
raise Fog::DNS::Dynect::NotFound unless zone = self.data[:zones][zone]
|
28
|
+
|
29
|
+
raise ArgumentError unless options.size == 1
|
30
|
+
|
31
|
+
response = Excon::Response.new
|
32
|
+
response.status = 200
|
33
|
+
|
34
|
+
data = {}
|
35
|
+
|
36
|
+
if options['freeze']
|
37
|
+
zone['frozen'] = true
|
38
|
+
info = "freeze: Your zone is now frozen"
|
39
|
+
elsif options['publish']
|
40
|
+
zone[:changes] = {}
|
41
|
+
zone[:records_to_delete].each do |record|
|
42
|
+
zone[:records][record[:type]].delete_if { |r| r[:fqdn] == record[:fqdn] && r[:record_id] == record[:record_id] }
|
43
|
+
end
|
44
|
+
zone[:records_to_delete] = []
|
45
|
+
data = {
|
46
|
+
"zone_type" => zone[:zone_type],
|
47
|
+
"serial_style" => zone[:serial_style],
|
48
|
+
"serial" => zone[:serial] += 1,
|
49
|
+
"zone" => zone[:zone]
|
50
|
+
}
|
51
|
+
info = "publish: #{zone[:zone]} published"
|
52
|
+
elsif options['thaw']
|
53
|
+
zone[:frozen] = false
|
54
|
+
info = "thaw: Your zone is now thawed, you may edit normally"
|
55
|
+
else
|
56
|
+
raise ArgumentError
|
57
|
+
end
|
58
|
+
|
59
|
+
response.body = {
|
60
|
+
"status" => "success",
|
61
|
+
"data" => data,
|
62
|
+
"job_id" => Fog::Dynect::Mock.job_id,
|
63
|
+
"msgs" => [{
|
64
|
+
"INFO" => info,
|
65
|
+
"SOURCE"=>"BLL",
|
66
|
+
"ERR_CD"=>nil,
|
67
|
+
"LVL"=>"INFO"
|
68
|
+
}]
|
69
|
+
}
|
70
|
+
|
71
|
+
response
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
require 'fog/core'
|
4
|
+
require 'fog/core/parser'
|
5
|
+
|
6
|
+
module Fog
|
7
|
+
module Dynect
|
8
|
+
extend Fog::Provider
|
9
|
+
|
10
|
+
service(:dns, 'ext/dynect/dns', 'DNS')
|
11
|
+
|
12
|
+
class Mock
|
13
|
+
def self.job_id
|
14
|
+
Fog::Mock.random_numbers(8).to_i
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.token
|
18
|
+
Fog::Mock.random_hex(48)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.version
|
22
|
+
[Fog::Mock.random_numbers(1), Fog::Mock.random_numbers(1), Fog::Mock.random_numbers(1)].join('.')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Mystro
|
2
|
+
module Cloud
|
3
|
+
class Action
|
4
|
+
attr_reader :action
|
5
|
+
attr_accessor :options, :class, :data
|
6
|
+
def initialize(klass, action)
|
7
|
+
@class = klass
|
8
|
+
@action = action
|
9
|
+
@options = {}
|
10
|
+
@data = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def model
|
14
|
+
@class.split('::').last
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_model
|
18
|
+
@class.constantize.new(@data)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Mystro
|
2
|
+
module Cloud
|
3
|
+
module Aws
|
4
|
+
class Balancer < Connect
|
5
|
+
manages 'Fog::Balancer', :load_balancers
|
6
|
+
|
7
|
+
def create(model)
|
8
|
+
list = model.computes
|
9
|
+
enc = encode(model)
|
10
|
+
bal = service.send(collection).create(enc)
|
11
|
+
bal.register_instances(list)
|
12
|
+
bal.save
|
13
|
+
decode(bal)
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def _decode(balancer)
|
19
|
+
model = Mystro::Cloud::Balancer.new
|
20
|
+
model.id = balancer.id
|
21
|
+
model.dns = balancer.dns_name
|
22
|
+
model.computes = balancer.instances
|
23
|
+
model.zones = balancer.availability_zones
|
24
|
+
model.health = balancer.health_check
|
25
|
+
|
26
|
+
decoded = []
|
27
|
+
balancer.listeners.each do |l|
|
28
|
+
decoded << listeners.decode(l)
|
29
|
+
end
|
30
|
+
model.listeners = decoded
|
31
|
+
|
32
|
+
model._raw = balancer
|
33
|
+
model
|
34
|
+
end
|
35
|
+
|
36
|
+
def _encode(model)
|
37
|
+
Mystro::Log.debug "encode < #{model.inspect}"
|
38
|
+
o = {
|
39
|
+
id: model.id,
|
40
|
+
'ListenerDescriptions' => model.listeners.map {|l| listeners.encode(l)},
|
41
|
+
'AvailabilityZones' => model.zones
|
42
|
+
}
|
43
|
+
Mystro::Log.debug "encode > #{o.inspect}"
|
44
|
+
o
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def listeners
|
50
|
+
@listeners ||= Mystro::Cloud::Aws::Listener.new(options)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|