diff --git a/examples/boot_env.rb b/examples/boot_env.rb index c35e44b..f8afdfd 100755 --- a/examples/boot_env.rb +++ b/examples/boot_env.rb @@ -42,7 +42,7 @@ exit end -env_options = {"blueprint_id": blueprint.id} +env_options = { "blueprint_id" => blueprint.id } puts "Booting environment using an specific blueprint...." provision_request = environment.boot(env_options) diff --git a/lib/ey-core/cli/cdn_distributions.rb b/lib/ey-core/cli/cdn_distributions.rb new file mode 100644 index 0000000..3a2cd80 --- /dev/null +++ b/lib/ey-core/cli/cdn_distributions.rb @@ -0,0 +1,50 @@ +require 'ey-core/cli/subcommand' +require 'ey-core/cli/helpers/stream_printer' + +module Ey + module Core + module Cli + class CdnDistributions < Subcommand + + include Ey::Core::Cli::Helpers::StreamPrinter + + title "cdn_distributions" + summary "Retrieve information about cdn distributions you have configured for your environments or applications." + + option :environment, + short: 'e', + long: 'environment', + description: 'Filter by environmeent name or id', + argument: 'Environment' + + option :application, + short: 'a', + long: 'application', + description: 'Filter by application name or id', + argument: 'Application' + + switch :display_sensitive, + short: 's', + long: 'display_sensitive', + description: 'Determines whether values of sensitive variables should be printed', + argument: 'Display Sensitive' + + def handle + cdn_distributions = if option(:application) + core_applications(option(:application)).flat_map(&:cdn_distributions) + elsif option(:environment) + core_environments(option(:environment)).flat_map(&:cdn_distributions) + else + core_cdn_distributions + end + + stream_print("ID" => 10, "Domain" => 30, "Origin" => 50, "Aliases" => 50, "Enabled" => 5, "Environment" => 30, "Application" => 30) do |printer| + cdn_distributions.each_entry do |distribution| + printer.print(distribution.id, distribution.domain, distribution.aliases.join(', '), distribution.enabled ? "yes" : "no", distribution.environment.name, distribution.application.name) + end + end + end + end + end + end +end \ No newline at end of file diff --git a/lib/ey-core/cli/helpers/core.rb b/lib/ey-core/cli/helpers/core.rb index de00182..025cc58 100644 --- a/lib/ey-core/cli/helpers/core.rb +++ b/lib/ey-core/cli/helpers/core.rb @@ -173,6 +173,35 @@ def core_accounts end end + # Fetches a list of environments by given name or ID. + # + # @param env_name_or_id [String] name or ID of environment. + # + # @return [Array] list of environments. + def core_environments(env_name_or_id) + core_client.environments.all(name: env_name_or_id).tap do |result| + result << core_client.environments.get(env_name_or_id) if result.empty? + end.to_a.compact + end + + # Fetches a list of applications by given name or ID. + # + # @param app_name_or_id [String] name or ID of application. + # + # @return [Array] list of environments. + def core_applications(app_name_or_id) + core_client.applications.all(name: app_name_or_id).tap do |result| + result << core_client.applications.get(app_name_or_id) if result.empty? + end.to_a.compact + end + + # Fetches a list of cdn distributions available for current user. + # + # @return [Array] list of cdn distributions. + def core_cdn_distributions + core_client.cdn_distributions + end + def write_core_yaml(token=nil) core_yaml[core_url] = token if token File.open(self.class.core_file, "w") {|file| diff --git a/lib/ey-core/client.rb b/lib/ey-core/client.rb index 2fdd355..9d43f7c 100644 --- a/lib/ey-core/client.rb +++ b/lib/ey-core/client.rb @@ -17,6 +17,7 @@ class Ey::Core::Client < Cistern::Service collection :auto_scaling_groups collection :backup_files collection :blueprints + collection :cdn_distributions collection :components collection :contacts collection :costs @@ -75,6 +76,7 @@ class Ey::Core::Client < Cistern::Service model :backup_file model :billing model :blueprint + model :cdn_distribution model :component model :contact model :cost @@ -138,6 +140,7 @@ class Ey::Core::Client < Cistern::Service request :create_application_archive request :create_auto_scaling_group request :create_backup_file + request :create_cdn_distribution request :create_database_server request :create_database_service request :create_database_service_snapshot @@ -167,6 +170,7 @@ class Ey::Core::Client < Cistern::Service request :destroy_addon request :destroy_auto_scaling_group request :destroy_blueprint + request :destroy_cdn_distribution request :destroy_database_server request :destroy_database_server_snapshot request :destroy_database_service @@ -215,6 +219,8 @@ class Ey::Core::Client < Cistern::Service request :get_billing request :get_blueprint request :get_blueprints + request :get_cdn_distribution + request :get_cdn_distributions request :get_component request :get_components request :get_contacts @@ -295,6 +301,7 @@ class Ey::Core::Client < Cistern::Service request :get_user request :get_users request :get_volumes + request :invalidate_cdn_distribution request :reboot_server request :reconcile_server request :request_callback @@ -315,6 +322,7 @@ class Ey::Core::Client < Cistern::Service request :update_auto_scaling_group request :update_billing request :update_blueprint + request :update_cdn_distribution request :update_environment request :update_membership request :update_provider_location diff --git a/lib/ey-core/client/mock.rb b/lib/ey-core/client/mock.rb index 15a85c8..f3afe86 100644 --- a/lib/ey-core/client/mock.rb +++ b/lib/ey-core/client/mock.rb @@ -122,6 +122,7 @@ def self.data :billing => {}, :blueprints => {}, :cluster_firewalls => [], + :cdn_distributions => {}, :components => components, :contact_assignments => [], :contacts => {}, diff --git a/lib/ey-core/collections/cdn_distributions.rb b/lib/ey-core/collections/cdn_distributions.rb new file mode 100644 index 0000000..aab4d8a --- /dev/null +++ b/lib/ey-core/collections/cdn_distributions.rb @@ -0,0 +1,9 @@ +class Ey::Core::Client::CdnDistributions < Ey::Core::Collection + + model Ey::Core::Client::CdnDistribution + + self.model_root = "cdn_distribution" + self.model_request = :get_cdn_distribution + self.collection_root = "cdn_distributions" + self.collection_request = :get_cdn_distributions +end diff --git a/lib/ey-core/models/application.rb b/lib/ey-core/models/application.rb index ac392b2..55436e9 100644 --- a/lib/ey-core/models/application.rb +++ b/lib/ey-core/models/application.rb @@ -9,6 +9,7 @@ class Ey::Core::Client::Application < Ey::Core::Model attribute :type has_one :account + has_one :cdn_distribution has_many :archives, key: :application_archives has_many :keypairs diff --git a/lib/ey-core/models/cdn_distribution.rb b/lib/ey-core/models/cdn_distribution.rb new file mode 100644 index 0000000..804d6d8 --- /dev/null +++ b/lib/ey-core/models/cdn_distribution.rb @@ -0,0 +1,51 @@ +class Ey::Core::Client::CdnDistribution < Ey::Core::Model + extend Ey::Core::Associations + + identity :id + + attribute :domain + attribute :aliases, type: :array + attribute :asset_host_name + attribute :enabled, type: :boolean + attribute :origin + attribute :provisioned_id + attribute :created_at, type: :time + attribute :updated_at, type: :time + attribute :deleted_at, type: :time + + has_one :provider + has_one :application + has_one :environment + + def save! + params = { + "cdn_distribution" => { + "aliases" => self.aliases, + "asset_host_name" => self.asset_host_name, + "enabled" => self.enabled + } + } + + if new_record? + requires :provider_id, :environment_id, :application_id + params.merge!("url" => self.collection.url, "provider" => self.provider_id, "environment" => self.environment_id, + "application" => self.application_id) + self.connection.requests.new(self.connection.create_cdn_distribution(params).body["request"]) + else + requires :identity + params["id"] = self.identity + params["cdn_distribution"]["origin"] = self.origin + self.connection.requests.new(self.connection.update_cdn_distribution(params).body["request"]) + end + end + + def invalidate(paths = ["*"]) + requires :identity + self.connection.requests.new(self.connection.invalidate_cdn_distribution("id" => self.identity, "paths" => paths).body["request"]) + end + + def destroy + requires :identity + self.connection.requests.new(self.connection.destroy_cdn_distribution("id" => self.identity).body["request"]) + end +end diff --git a/lib/ey-core/models/environment.rb b/lib/ey-core/models/environment.rb index 252ff60..b835787 100644 --- a/lib/ey-core/models/environment.rb +++ b/lib/ey-core/models/environment.rb @@ -31,6 +31,7 @@ class Ey::Core::Client::Environment < Ey::Core::Model has_many :applications has_many :logical_databases has_many :deployments + has_many :cdn_distributions attr_accessor :application_id diff --git a/lib/ey-core/models/request.rb b/lib/ey-core/models/request.rb index afe33d6..ae9cd4d 100644 --- a/lib/ey-core/models/request.rb +++ b/lib/ey-core/models/request.rb @@ -55,6 +55,8 @@ def resource self.connection.addresses.get!(resource_id) when /auto_scaling_group/ self.connection.auto_scaling_groups.get!(resource_id) + when /cdn_distribution/ + self.connection.cdn_distributions.get!(resource_id) when /cluster_update/ self.connection.cluster_updates.get!(resource_id) when /database_server_snapshot/ diff --git a/lib/ey-core/requests/create_application.rb b/lib/ey-core/requests/create_application.rb index 16916e1..e284ae8 100644 --- a/lib/ey-core/requests/create_application.rb +++ b/lib/ey-core/requests/create_application.rb @@ -40,13 +40,14 @@ def create_application(params={}) end resource.merge!( - "account" => url_for("/accounts/#{account_id}"), - "archives" => url_for("/applications/#{resource_id}/archives"), - "keypairs" => url_for("/applications/#{resource_id}/keypairs"), - "language" => language, - "created_at" => Time.now, - "updated_at" => Time.now, - "id" => resource_id, + "account" => url_for("/accounts/#{account_id}"), + "archives" => url_for("/applications/#{resource_id}/archives"), + "keypairs" => url_for("/applications/#{resource_id}/keypairs"), + "language" => language, + "created_at" => Time.now, + "updated_at" => Time.now, + "id" => resource_id, + "cdn_distributions" => url_for("/applications/#{resource_id}/cdn-distributions") ) key = mock_ssh_key diff --git a/lib/ey-core/requests/create_cdn_distribution.rb b/lib/ey-core/requests/create_cdn_distribution.rb new file mode 100644 index 0000000..43d4cfc --- /dev/null +++ b/lib/ey-core/requests/create_cdn_distribution.rb @@ -0,0 +1,62 @@ +class Ey::Core::Client + class Real + def create_cdn_distribution(params={}) + url = params.delete("url") + + request( + :method => :post, + :path => "/cdn-distributions", + :url => url, + :body => params, + ) + end + end + + class Mock + def create_cdn_distribution(params={}) + request_id = self.uuid + resource_id = self.serial_id + + provider_id = resource_identity(params["provider"]) + environment_id = resource_identity(params["environment"]) + application_id = resource_identity(params["application"]) + + find(:providers, provider_id) + + resource = params["cdn_distribution"].dup + + resource.merge!( + "id" => resource_id, + "provisioned_id" => SecureRandom.hex(10), + "resource_url" => "/cdn-distributions/#{resource_id}", + "provider" => url_for("/providers/#{provider_id}"), + "environment" => url_for("/environments/#{environment_id}"), + "application" => url_for("/applications/#{application_id}"), + "deleted_at" => nil, + "domain" => Faker::Internet.domain_name, + "origin" => Faker::Internet.domain_name + ) + + self.data[:cdn_distributions][resource_id] = resource + + request = { + "id" => request_id, + "type" => "provision_cdn_distribution", + "successful" => "true", + "started_at" => Time.now, + "finished_at" => nil, + "resource" => [:cdn_distributions, resource_id, resource], + } + + self.data[:requests][request_id] = request + + response_hash = request.dup + response_hash.delete("resource") + + response( + :body => {"request" => response_hash}, + :status => 201, + ) + end + end +end diff --git a/lib/ey-core/requests/create_environment.rb b/lib/ey-core/requests/create_environment.rb index 0aa838d..43ad28a 100644 --- a/lib/ey-core/requests/create_environment.rb +++ b/lib/ey-core/requests/create_environment.rb @@ -48,7 +48,8 @@ def create_environment(params={}) "stack_name" => "nginx_passenger4", "updated_at" => Time.now, "username" => "deploy", - "service_level" => "default" + "service_level" => "default", + "cdn_distributions" => url_for("/environments/#{resource_id}/cdn-distributions") ) self.data[:environments][resource_id] = resource diff --git a/lib/ey-core/requests/destroy_cdn_distribution.rb b/lib/ey-core/requests/destroy_cdn_distribution.rb new file mode 100644 index 0000000..38cc29d --- /dev/null +++ b/lib/ey-core/requests/destroy_cdn_distribution.rb @@ -0,0 +1,30 @@ +class Ey::Core::Client + class Real + def destroy_cdn_distribution(params={}) + id = params["id"] + url = params.delete("url") + + request( + :path => "/cdn-distributions/#{id}", + :url => url, + :method => :delete, + ) + end + end + + class Mock + def destroy_cdn_distribution(params={}) + request_id = self.uuid + url = params.delete("url") + + cdn_distribution_id = params["id"] || url && url.split('/').last + + self.data[:cdn_distributions][cdn_distribution_id]["deleted_at"] = Time.now + + response( + :body => {"request" => {id: request_id}}, + :status => 201, + ) + end + end +end diff --git a/lib/ey-core/requests/get_cdn_distribution.rb b/lib/ey-core/requests/get_cdn_distribution.rb new file mode 100644 index 0000000..9c510ef --- /dev/null +++ b/lib/ey-core/requests/get_cdn_distribution.rb @@ -0,0 +1,21 @@ +class Ey::Core::Client + class Real + def get_cdn_distribution(params={}) + id = params["id"] + url = params["url"] + + request( + :path => "/cdn-distributions/#{id}", + :url => url, + ) + end + end + + class Mock + def get_cdn_distribution(params={}) + response( + :body => {"cdn_distribution" => self.find(:cdn_distributions, resource_identity(params))}, + ) + end + end +end diff --git a/lib/ey-core/requests/get_cdn_distributions.rb b/lib/ey-core/requests/get_cdn_distributions.rb new file mode 100644 index 0000000..2b468b4 --- /dev/null +++ b/lib/ey-core/requests/get_cdn_distributions.rb @@ -0,0 +1,29 @@ +class Ey::Core::Client + class Real + def get_cdn_distributions(params={}) + query = Ey::Core.paging_parameters(params) + url = params.delete("url") + + request( + :params => params, + :query => query, + :path => "/cdn-distributions", + :url => url, + ) + end + end + + class Mock + def get_cdn_distributions(params={}) + extract_url_params!(params) + + headers, cdn_distributions_page = search_and_page(params, :cdn_distributions, search_keys: %w[application environment]) + + response( + :body => {"cdn_distributions" => cdn_distributions_page}, + :status => 200, + :headers => headers + ) + end + end # Mock +end diff --git a/lib/ey-core/requests/invalidate_cdn_distribution.rb b/lib/ey-core/requests/invalidate_cdn_distribution.rb new file mode 100644 index 0000000..4538b6a --- /dev/null +++ b/lib/ey-core/requests/invalidate_cdn_distribution.rb @@ -0,0 +1,26 @@ +class Ey::Core::Client + class Real + def invalidate_cdn_distribution(params={}) + id = params.delete("id") + url = params.delete("url") + + request( + :path => "/cdn-distributions/#{id}/invalidate", + :url => url, + :method => :put, + :body => params + ) + end + end + + class Mock + def invalidate_cdn_distribution(_params={}) + request_id = self.uuid + + response( + :body => {"request" => {id: request_id}}, + :status => 201, + ) + end + end +end diff --git a/lib/ey-core/requests/update_cdn_distribution.rb b/lib/ey-core/requests/update_cdn_distribution.rb new file mode 100644 index 0000000..2071ce1 --- /dev/null +++ b/lib/ey-core/requests/update_cdn_distribution.rb @@ -0,0 +1,39 @@ +class Ey::Core::Client + class Real + def update_cdn_distribution(params={}) + id = params.delete("id") + + request( + :method => :put, + :path => "/cdn-distributions/#{id}", + :body => params, + ) + end + end + + class Mock + def update_cdn_distribution(params={}) + request_id = self.uuid + cdn_distribution = self.find(:cdn_distributions, resource_identity(params)) + + cdn_distribution.merge!(params["cdn_distribution"]) + + request = { + "id" => request_id, + "type" => "update_cdn_distribution", + "successful" => "true", + "started_at" => Time.now, + "finished_at" => nil, + "resource" => [:cdn_distributions, cdn_distribution["id"], cdn_distribution] + } + + self.data[:requests][request_id] = request + + response( + :body => { + "request" => request.dup.tap { |req| req.delete("resource") } + } + ) + end + end +end diff --git a/spec/cdn_distributions_spec.rb b/spec/cdn_distributions_spec.rb new file mode 100644 index 0000000..32a3f49 --- /dev/null +++ b/spec/cdn_distributions_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe 'as a user' do + let!(:client) { create_client } + let!(:account) { create_account(client: client) } + let!(:provider) { create_provider(account: account) } + let!(:application) { create_application(account: account) } + let!(:environment) { create_environment(account: account, application: application) } + + it "creates a cdn distribution" do + req = client.cdn_distributions.create!(provider: provider, + application: application, + environment: environment) + + cdn_distribution = req.resource! + + expect(cdn_distribution.provider).to eq(provider) + expect(cdn_distribution.application).to eq(application) + expect(cdn_distribution.environment).to eq(environment) + expect(cdn_distribution.domain).to_not be_nil + expect(cdn_distribution.origin).to_not be_nil + end + + context "with a cdn distribution" do + let!(:cdn_distribution) { client.cdn_distributions.create!(provider: provider, application: application, environment: environment).resource! } + + it "destroys a cdn distribution" do + expect { cdn_distribution.destroy }.to change { client.cdn_distributions.all.size }.by(-1) + expect(cdn_distribution.reload.deleted_at).not_to be_nil + end + + it "updates a cdn distribution" do + cdn_distribution.aliases = ["one", "two", "three"] + cdn_distribution.asset_host_name = "whatever.com" + cdn_distribution.save.resource! + expect(cdn_distribution.aliases).to include("one", "two", "three") + expect(cdn_distribution.asset_host_name).to eq("whatever.com") + end + end +end