diff --git a/lib/harp-runtime/models/compute.rb b/lib/harp-runtime/models/compute.rb index b175410..b0f0ae8 100644 --- a/lib/harp-runtime/models/compute.rb +++ b/lib/harp-runtime/models/compute.rb @@ -13,6 +13,9 @@ class ElasticIP < HarpResource property :public_ip_address, String end +class ElasticIPAssociation < HarpResource +end + class SecurityGroup < HarpResource end diff --git a/lib/harp-runtime/resources/compute/elastic_ip.rb b/lib/harp-runtime/resources/compute/elastic_ip.rb index f9d9d0c..a9cb318 100644 --- a/lib/harp-runtime/resources/compute/elastic_ip.rb +++ b/lib/harp-runtime/resources/compute/elastic_ip.rb @@ -10,14 +10,10 @@ class ElasticIP < AvailableResource include Harp::Resources - attribute :id + attribute :id, :aliases => 'allocation_id' attribute :public_ip_address attribute :public_ip, :aliases => 'publicIp' - attribute :allocation_id, :aliases => 'allocationId' - attribute :association_id, :aliases => 'associationId' attribute :server_id, :aliases => 'instanceId' - attribute :network_interface_id, :aliases => 'networkInterfaceId' - attribute :network_interface_owner_id, :aliases => 'networkInterfaceOwnerId' attribute :domain register_resource :elastic_ip, RESOURCES_COMPUTE @@ -28,9 +24,11 @@ class ElasticIP < AvailableResource # Return persistable attributes with only desired attributes to keep def keep(attribs) attribs[:public_ip_address] = attribs[:public_ip] + attribs[:id] = attribs[:allocation_id] super end + def self.persistent_type() ::ElasticIP end @@ -39,7 +37,7 @@ def self.persistent_type() def create(service) create_attribs = self.attribs address = service.addresses.create(create_attribs) - @id = SecureRandom.urlsafe_base64(16) + address.allocation_id = SecureRandom.urlsafe_base64(16) return address end diff --git a/lib/harp-runtime/resources/compute/elastic_ip_association.rb b/lib/harp-runtime/resources/compute/elastic_ip_association.rb new file mode 100644 index 0000000..7573c00 --- /dev/null +++ b/lib/harp-runtime/resources/compute/elastic_ip_association.rb @@ -0,0 +1,56 @@ +require 'set' +require 'fog/core/model' +require 'harp-runtime/models/compute' +require 'json' + +module Harp + module Resources + + class ElasticIPAssociation < AvailableResource + + include Harp::Resources + + attribute :id, :aliases => 'associationId' + attribute :allocation_id, :aliases => 'allocationId' + attribute :server_id, :aliases => 'instanceId' + attribute :network_interface_id, :aliases => 'networkInterfaceId' + attribute :network_interface_owner_id, :aliases => 'networkInterfaceOwnerId' + + + register_resource :elastic_ip_association, RESOURCES_COMPUTE + + # Only keeping a few properties, simplest define keeps. + @keeps = /^id$/ + + # Return persistable attributes with only desired attributes to keep + def keep(attribs) + attribs[:id] = attribs[:association_id] + super + end + + def self.persistent_type() + ::ElasticIPAssociation + end + + + def create(service) + create_attribs = self.attribs + address = service.addresses.create(create_attribs) + address.association_id = SecureRandom.urlsafe_base64(16) + return address + end + + def destroy(service) + destroy_attribs = self.attribs + binding.pry + if @id + address = service.addresses.destroy(destroy_attribs) + else + puts "No ID set, cannot delete." + end + return address + end + + end + end +end diff --git a/lib/harp-runtime/resources/compute/types.rb b/lib/harp-runtime/resources/compute/types.rb index 58c0006..f6f3add 100644 --- a/lib/harp-runtime/resources/compute/types.rb +++ b/lib/harp-runtime/resources/compute/types.rb @@ -1,6 +1,7 @@ require 'set' require 'harp-runtime/resources/compute/elastic_ip' +require 'harp-runtime/resources/compute/elastic_ip_association' require 'harp-runtime/resources/compute/instance' require 'harp-runtime/resources/compute/security_group' require 'harp-runtime/resources/compute/volume' diff --git a/spec/compute_cloud_spec.rb b/spec/compute_cloud_spec.rb index 4e40905..b139da9 100644 --- a/spec/compute_cloud_spec.rb +++ b/spec/compute_cloud_spec.rb @@ -9,11 +9,32 @@ "instanceType" => "t1.micro" } +ins_for_asso = { + "type" => "Std::ComputeInstance", + "imageId" => "ami-d0f89fb9", + "instanceType" => "t1.micro" +} + +eip_for_asso = { + "type" => "Std::ElasticIP", + "server_id" => "" +} + +eip_association_resource = { + "type" => "Std::ElasticIPAssociation", + "allocation_id" => "", + "server_id" => "" +} + elastic_ip_resource = { "type" => "Std::ElasticIP", "public_ip" => "123.4.5.6" } +eip_association_resource = { + "type" => "Std::ElasticIPAssociation", +} + security_group_resource = { "type" => "Std::SecurityGroup", "name" => "web-security-group", @@ -26,6 +47,8 @@ "size" => 5 } + + describe Harp::Cloud::CloudMutator, "#create" do include_context "when have mutator" @@ -35,6 +58,20 @@ expect(result.name).to eq("test_eip1") end + it "creates elastic ip association" do + inst = mutator.create("ins_for_asso", ins_for_asso) + eip_for_asso["server_id"] = inst.instance_variable_get(:@id) + + eip = mutator.create("eip_for_asso", eip_for_asso) + eip_association_resource["allocation_id"] = eip.instance_variable_get(:@id) + eip_association_resource["server_id"] = inst.instance_variable_get(:@id) + + result = mutator.create("test_eip_asso", eip_association_resource) + expect(result.class).to eq(ElasticIPAssociation) + expect(result.name).to eq("test_eip_asso") + expect(result.state).to eq(Harp::Resources::AvailableResource::CREATED) + end + it "creates a cloud instance" do result = mutator.create("test_inst1", instance_resource) @@ -50,7 +87,7 @@ expect(result.description).to eq("A web security group") end - + it "creates a volume" do result = mutator.create("test_vol1", volume_resource) expect(result.class).to eq(Volume)