mystro-common 0.1.11 → 0.2.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.
- 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
         |