sitefull-cloud 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sitefull-cloud/provider/amazon.rb +1 -2
- data/lib/sitefull-cloud/provider/amazon/networking.rb +2 -0
- data/lib/sitefull-cloud/provider/azure.rb +78 -16
- data/lib/sitefull-cloud/provider/azure/instance.rb +140 -0
- data/lib/sitefull-cloud/provider/azure/networking.rb +59 -0
- data/lib/sitefull-cloud/version.rb +1 -1
- data/sitefull-cloud.gemspec +5 -1
- metadata +61 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b44374ca90cb087ee38d5b095bb8257e1ec55480
|
4
|
+
data.tar.gz: e317493fe79e7718c51baccef7594b08c6bda203
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 526d34eb28d2f17203801ccd0b7fc2edd078983c3d1f9e10145d5da3ca299567527df9a9d7fada166700a180ab57ef01f7c1016a6a2d5948352f963cba985357
|
7
|
+
data.tar.gz: bfbb2cfe515e3f099d5727a8474d3708d9c480919ca7f72a0ac9fb5ce06b2a762ee28eb43d8f13bddd609dfccebf05d45436bc0237efc30b613a700338ff434f
|
@@ -29,9 +29,8 @@ module Sitefull
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def images(os)
|
32
|
-
# IMAGES[os.to_sym]
|
33
32
|
filters = [{ name: 'name', values: ["#{os}*", "#{os.downcase}*"] }, { name: 'is-public', values: ['true'] }, { name: 'virtualization-type', values: ['hvm'] }]
|
34
|
-
connection.describe_images(filters: filters).images.map { |i| OpenStruct.new(id: i.image_id, name: i.name) }
|
33
|
+
connection.describe_images(filters: filters).images.select { |i| i.image_owner_alias.nil? }.map { |i| OpenStruct.new(id: i.image_id, name: i.name) }
|
35
34
|
end
|
36
35
|
|
37
36
|
def create_network
|
@@ -64,6 +64,8 @@ module Sitefull
|
|
64
64
|
|
65
65
|
def add_security_group_rules
|
66
66
|
connection.authorize_security_group_ingress(group_id: security_group.group_id, ip_protocol: 'tcp', from_port: 22, to_port: 22, cidr_ip: '0.0.0.0/0')
|
67
|
+
connection.authorize_security_group_ingress(group_id: security_group.group_id, ip_protocol: 'tcp', from_port: 80, to_port: 80, cidr_ip: '0.0.0.0/0')
|
68
|
+
connection.authorize_security_group_ingress(group_id: security_group.group_id, ip_protocol: 'tcp', from_port: 443, to_port: 443, cidr_ip: '0.0.0.0/0')
|
67
69
|
add_tags(security_group.group_id)
|
68
70
|
end
|
69
71
|
|
@@ -1,38 +1,77 @@
|
|
1
|
-
require '
|
2
|
-
require 'azure_mgmt_network'
|
1
|
+
require 'faraday_middleware'
|
3
2
|
require 'azure_mgmt_resources'
|
3
|
+
require 'sitefull-cloud/provider/azure/networking'
|
4
|
+
require 'sitefull-cloud/provider/azure/instance'
|
4
5
|
|
5
6
|
module Sitefull
|
6
7
|
module Provider
|
7
8
|
module Azure
|
8
|
-
|
9
|
+
extend ActiveSupport
|
10
|
+
include ::Azure::ARM::Resources::Models
|
11
|
+
include Networking
|
12
|
+
include Instance
|
13
|
+
|
14
|
+
REQUIRED_OPTIONS = %w(region subscription_id).freeze
|
15
|
+
|
16
|
+
IMAGES = {
|
17
|
+
debian: { publisher: 'Credativ', offer: 'Debian' },
|
18
|
+
ubuntu: { publisher: 'Canonical', offer: 'UbuntuServer' },
|
19
|
+
centos: { publisher: 'OpenLogic', offer: 'CentOS' },
|
20
|
+
rhel: { publisher: 'RedHat', offer: 'RHEL' },
|
21
|
+
suse: { publisher: 'Suse', offer: 'OpenSUSE' },
|
22
|
+
windows_server_2008: { publisher: 'MicrosoftWindowsServer', offer: 'WindowsServer', sku_filter: '2008' },
|
23
|
+
windows_server_2012: { publisher: 'MicrosoftWindowsServer', offer: 'WindowsServer', sku_filter: '2012' },
|
24
|
+
windows_server_2016: { publisher: 'MicrosoftWindowsServer', offer: 'WindowsServer', sku_filter: '2016' }
|
25
|
+
}.freeze
|
26
|
+
|
27
|
+
NETWORK_CIDR_BLOCK = '172.16.0.0/16'.freeze
|
28
|
+
SUBNET_CIDR_BLOCK = '172.16.1.0/24'.freeze
|
29
|
+
NETWORK_NAME = 'sitefull'.freeze
|
30
|
+
SUBNET_NAME = 'sitefull'.freeze
|
31
|
+
RESOURCE_GROUP = 'sitefull'.freeze
|
32
|
+
SECURITY_GROUP = 'sitefull'.freeze
|
33
|
+
PUBLIC_IP_NAME = 'sitefull'.freeze
|
9
34
|
|
10
35
|
def connection
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
36
|
+
return @connection unless @connection.nil?
|
37
|
+
|
38
|
+
connections = {
|
39
|
+
arm: ::Azure::ARM::Resources::ResourceManagementClient.new(credentials),
|
40
|
+
compute: ::Azure::ARM::Compute::ComputeManagementClient.new(credentials),
|
41
|
+
network: ::Azure::ARM::Network::NetworkManagementClient.new(credentials),
|
42
|
+
storage: ::Azure::ARM::Storage::StorageManagementClient.new(credentials)
|
43
|
+
}
|
44
|
+
connections.each { |_, v| v.subscription_id = options[:subscription_id] }
|
45
|
+
@connection = OpenStruct.new(connections)
|
16
46
|
end
|
17
47
|
|
18
48
|
def regions
|
19
|
-
|
49
|
+
@regions ||= connection.arm.providers.get('Microsoft.Compute').value!.body.resource_types.find { |rt| rt.resource_type == 'virtualMachines' }.locations.map { |l| OpenStruct.new(id: l.downcase.gsub(/\s/, ''), name: l) }
|
20
50
|
end
|
21
51
|
|
22
52
|
def machine_types(region)
|
23
|
-
|
53
|
+
@machine_types ||= connection.compute.virtual_machine_sizes.list(region).value!.body.value.map { |mt| OpenStruct.new(id: mt.name, name: mt.name) }
|
24
54
|
end
|
25
55
|
|
26
56
|
def images(os)
|
27
|
-
|
57
|
+
@images unless @images.nil?
|
58
|
+
|
59
|
+
search = IMAGES[os.to_sym]
|
60
|
+
image_skus = connection.compute.virtual_machine_images.list_skus(options[:region], search[:publisher], search[:offer]).value!.body
|
61
|
+
@images = image_skus.map { |sku| OpenStruct.new(id: "#{search[:publisher]}:#{search[:offer]}:#{sku.name}", name: "#{search[:offer]} #{sku.name}") }
|
28
62
|
end
|
29
63
|
|
30
64
|
def create_network
|
31
|
-
|
65
|
+
resource_group = resource_group_setup.value!.body
|
66
|
+
security_group = security_group_setup.value!.body
|
67
|
+
network = network_setup(resource_group, security_group).value!.body
|
68
|
+
network.properties.subnets.last.name
|
32
69
|
end
|
33
70
|
|
34
|
-
def create_firewall_rules(
|
35
|
-
|
71
|
+
def create_firewall_rules(_)
|
72
|
+
inbound_firewall_rule 'ssh', '22', 100
|
73
|
+
inbound_firewall_rule 'http', '80', 101
|
74
|
+
inbound_firewall_rule 'https', '443', 102
|
36
75
|
end
|
37
76
|
|
38
77
|
def create_key(key_name)
|
@@ -40,11 +79,34 @@ module Sitefull
|
|
40
79
|
end
|
41
80
|
|
42
81
|
def create_instance(deployment)
|
43
|
-
deployment
|
82
|
+
name = "sitefull-deployment-#{deployment.id}"
|
83
|
+
subnet = connection.network.subnets.get(resource_group_name, NETWORK_NAME, SUBNET_NAME).value!.body
|
84
|
+
security_group = connection.network.network_security_groups.get(resource_group_name, SECURITY_GROUP).value!.body
|
85
|
+
public_ip = public_ip_setup(name).value!.body
|
86
|
+
network_interface = network_interface_setup(subnet, security_group, public_ip, name).value!.body
|
87
|
+
storage = storage_setup(name)
|
88
|
+
instance_setup(storage, network_interface, deployment.machine_type, deployment.image, name).value!.body.name
|
44
89
|
end
|
45
90
|
|
46
91
|
def valid?
|
47
|
-
|
92
|
+
!connection.empty?
|
93
|
+
rescue StandardError
|
94
|
+
false
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def resource_group_name
|
100
|
+
"#{RESOURCE_GROUP}-#{options[:region]}"
|
101
|
+
end
|
102
|
+
|
103
|
+
def resource_group_setup
|
104
|
+
resource_group = ResourceGroup.new
|
105
|
+
resource_group.location = options[:region]
|
106
|
+
connection.arm.resource_groups.create_or_update(resource_group_name, resource_group)
|
107
|
+
end
|
108
|
+
|
109
|
+
def image_skus
|
48
110
|
end
|
49
111
|
end
|
50
112
|
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'azure_mgmt_compute'
|
2
|
+
require 'azure_mgmt_network'
|
3
|
+
require 'azure_mgmt_storage'
|
4
|
+
|
5
|
+
module Sitefull
|
6
|
+
module Provider
|
7
|
+
module Azure
|
8
|
+
module Instance
|
9
|
+
include ::Azure::ARM::Compute::Models
|
10
|
+
include ::Azure::ARM::Network::Models
|
11
|
+
include ::Azure::ARM::Storage::Models
|
12
|
+
|
13
|
+
STORAGE_ACCOUNT_TYPE = 'Standard_LRS'.freeze
|
14
|
+
|
15
|
+
private
|
16
|
+
def network_interface_setup(subnet, security_group, public_ip, name)
|
17
|
+
ip_configuration_props = NetworkInterfaceIPConfigurationPropertiesFormat.new
|
18
|
+
ip_configuration_props.private_ipallocation_method = 'Dynamic'
|
19
|
+
ip_configuration_props.subnet = subnet
|
20
|
+
ip_configuration_props.public_ipaddress = public_ip
|
21
|
+
|
22
|
+
ip_configuration = NetworkInterfaceIPConfiguration.new
|
23
|
+
ip_configuration.name = name
|
24
|
+
ip_configuration.properties = ip_configuration_props
|
25
|
+
|
26
|
+
props = NetworkInterfacePropertiesFormat.new
|
27
|
+
props.primary = true
|
28
|
+
props.network_security_group = security_group
|
29
|
+
props.ip_configurations = [ip_configuration]
|
30
|
+
|
31
|
+
network_interface = NetworkInterface.new
|
32
|
+
network_interface.location = options[:region]
|
33
|
+
network_interface.name = name
|
34
|
+
network_interface.properties = props
|
35
|
+
|
36
|
+
connection.network.network_interfaces.create_or_update(resource_group_name, name, network_interface)
|
37
|
+
end
|
38
|
+
|
39
|
+
def public_ip_setup(name)
|
40
|
+
dns_settings = PublicIPAddressDnsSettings.new
|
41
|
+
dns_settings.domain_name_label = name
|
42
|
+
|
43
|
+
props = PublicIPAddressPropertiesFormat.new
|
44
|
+
props.public_ipallocation_method = 'Dynamic'
|
45
|
+
props.dns_settings = dns_settings
|
46
|
+
|
47
|
+
public_ip = PublicIPAddress.new
|
48
|
+
public_ip.location = options[:region]
|
49
|
+
public_ip.properties = props
|
50
|
+
|
51
|
+
connection.network.public_ipaddresses.create_or_update(resource_group_name, name, public_ip)
|
52
|
+
end
|
53
|
+
|
54
|
+
def storage_setup(name)
|
55
|
+
storage_account = connection.storage.storage_accounts.list_by_resource_group(resource_group_name).value!.body.value.find { |sa| sa.name == storage_account_name(name) }
|
56
|
+
return storage_account unless storage_account.nil?
|
57
|
+
|
58
|
+
properties = StorageAccountPropertiesCreateParameters.new
|
59
|
+
properties.account_type = STORAGE_ACCOUNT_TYPE
|
60
|
+
|
61
|
+
params = StorageAccountCreateParameters.new
|
62
|
+
params.properties = properties
|
63
|
+
params.location = options[:region]
|
64
|
+
|
65
|
+
connection.storage.storage_accounts.create(resource_group_name, storage_account_name(name), params).value!.body
|
66
|
+
end
|
67
|
+
|
68
|
+
def instance_setup(storage, network_interface, machine_type, image, name)
|
69
|
+
# Create a model for new virtual machine
|
70
|
+
props = VirtualMachineProperties.new
|
71
|
+
|
72
|
+
#windows_config = WindowsConfiguration.new
|
73
|
+
#windows_config.provision_vmagent = true
|
74
|
+
#windows_config.enable_automatic_updates = true
|
75
|
+
linux_config = LinuxConfiguration.new
|
76
|
+
linux_config.disable_password_authentication = false
|
77
|
+
|
78
|
+
os_profile = OSProfile.new
|
79
|
+
os_profile.computer_name = name
|
80
|
+
os_profile.admin_username = 'sitefull'
|
81
|
+
os_profile.admin_password = 'P@ssword1'
|
82
|
+
os_profile.linux_configuration = linux_config
|
83
|
+
# os_profile.custom_data = Base64.strict_encode64("#!/bin/sh\necho \"Hello World!\"").encode('utf-8')
|
84
|
+
|
85
|
+
os_profile.secrets = []
|
86
|
+
props.os_profile = os_profile
|
87
|
+
|
88
|
+
hardware_profile = HardwareProfile.new
|
89
|
+
hardware_profile.vm_size = machine_type
|
90
|
+
props.hardware_profile = hardware_profile
|
91
|
+
|
92
|
+
props.storage_profile = create_storage_profile(image, storage.name)
|
93
|
+
|
94
|
+
network_profile = NetworkProfile.new
|
95
|
+
network_profile.network_interfaces = [network_interface]
|
96
|
+
props.network_profile = network_profile
|
97
|
+
|
98
|
+
params = VirtualMachine.new
|
99
|
+
params.type = 'Microsoft.Compute/virtualMachines'
|
100
|
+
params.properties = props
|
101
|
+
params.location = options[:region]
|
102
|
+
|
103
|
+
connection.compute.virtual_machines.create_or_update(resource_group_name, name, params)
|
104
|
+
end
|
105
|
+
|
106
|
+
def create_storage_profile(image, name)
|
107
|
+
storage_profile = StorageProfile.new
|
108
|
+
storage_profile.image_reference = get_image_reference(image)
|
109
|
+
|
110
|
+
os_disk = OSDisk.new
|
111
|
+
os_disk.caching = 'ReadWrite'
|
112
|
+
os_disk.create_option = 'FromImage'
|
113
|
+
os_disk.name = name
|
114
|
+
|
115
|
+
virtual_hard_disk = VirtualHardDisk.new
|
116
|
+
virtual_hard_disk.uri = "https://#{name}.blob.core.windows.net/vhds/os.vhd"
|
117
|
+
|
118
|
+
os_disk.vhd = virtual_hard_disk
|
119
|
+
storage_profile.os_disk = os_disk
|
120
|
+
|
121
|
+
storage_profile
|
122
|
+
end
|
123
|
+
|
124
|
+
def get_image_reference(image)
|
125
|
+
publisher, offer, sku = image.split(':')
|
126
|
+
image_reference = ImageReference.new
|
127
|
+
image_reference.publisher = publisher
|
128
|
+
image_reference.offer = offer
|
129
|
+
image_reference.sku = sku
|
130
|
+
image_reference.version = 'latest'
|
131
|
+
image_reference
|
132
|
+
end
|
133
|
+
|
134
|
+
def storage_account_name(name)
|
135
|
+
@storage_account_name ||= Digest::MD5.hexdigest("#{resource_group_name}:#{name}")[0..23]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'azure_mgmt_network'
|
2
|
+
|
3
|
+
module Sitefull
|
4
|
+
module Provider
|
5
|
+
module Azure
|
6
|
+
module Networking
|
7
|
+
include ::Azure::ARM::Network::Models
|
8
|
+
|
9
|
+
private
|
10
|
+
def security_group_setup
|
11
|
+
props = NetworkSecurityGroupPropertiesFormat.new
|
12
|
+
|
13
|
+
security_group = NetworkSecurityGroup.new
|
14
|
+
security_group.location = options[:region]
|
15
|
+
security_group.properties = props
|
16
|
+
|
17
|
+
connection.network.network_security_groups.create_or_update(resource_group_name, SECURITY_GROUP, security_group)
|
18
|
+
end
|
19
|
+
|
20
|
+
def network_setup(resource_group, security_group)
|
21
|
+
props = VirtualNetworkPropertiesFormat.new
|
22
|
+
|
23
|
+
address_space = AddressSpace.new
|
24
|
+
address_space.address_prefixes = [NETWORK_CIDR_BLOCK]
|
25
|
+
props.address_space = address_space
|
26
|
+
|
27
|
+
subnet_props = SubnetPropertiesFormat.new
|
28
|
+
subnet_props.address_prefix = SUBNET_CIDR_BLOCK
|
29
|
+
subnet_props.network_security_group = security_group
|
30
|
+
|
31
|
+
subnet = Subnet.new
|
32
|
+
subnet.name = SUBNET_NAME
|
33
|
+
subnet.properties = subnet_props
|
34
|
+
props.subnets = [subnet]
|
35
|
+
|
36
|
+
params = VirtualNetwork.new
|
37
|
+
params.location = options[:region]
|
38
|
+
params.properties = props
|
39
|
+
|
40
|
+
connection.network.virtual_networks.create_or_update(resource_group.name, NETWORK_NAME, params)
|
41
|
+
end
|
42
|
+
|
43
|
+
def firewall_rule_setup(name, options = {})
|
44
|
+
props = SecurityRulePropertiesFormat.new
|
45
|
+
options.each { |key, value| props.send("#{key}=", value) }
|
46
|
+
|
47
|
+
security_rule = SecurityRule.new
|
48
|
+
security_rule.properties = props
|
49
|
+
|
50
|
+
connection.network.security_rules.create_or_update(resource_group_name, SECURITY_GROUP, name, security_rule)
|
51
|
+
end
|
52
|
+
|
53
|
+
def inbound_firewall_rule(name, port, priority)
|
54
|
+
firewall_rule_setup(name, protocol: '*', source_port_range: '*', destination_port_range: port, source_address_prefix: '*', destination_address_prefix: '*', priority: priority, access: 'Allow', direction: 'Inbound').value!
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/sitefull-cloud.gemspec
CHANGED
@@ -27,9 +27,13 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_dependency 'signet'
|
28
28
|
spec.add_dependency 'google-api-client'
|
29
29
|
spec.add_dependency 'aws-sdk'
|
30
|
+
spec.add_dependency 'azure'
|
31
|
+
spec.add_dependency 'faraday'
|
30
32
|
spec.add_dependency 'azure_mgmt_compute'
|
31
|
-
spec.add_dependency 'azure_mgmt_resources'
|
32
33
|
spec.add_dependency 'azure_mgmt_network'
|
34
|
+
spec.add_dependency 'azure_mgmt_resources'
|
35
|
+
spec.add_dependency 'azure_mgmt_storage'
|
36
|
+
spec.add_dependency 'activesupport'
|
33
37
|
|
34
38
|
spec.add_development_dependency "bundler"
|
35
39
|
spec.add_development_dependency "rake"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sitefull-cloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stanimir Dimitrov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -66,6 +66,34 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: azure
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: faraday
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: azure_mgmt_compute
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +108,20 @@ dependencies:
|
|
80
108
|
- - ">="
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: azure_mgmt_network
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
83
125
|
- !ruby/object:Gem::Dependency
|
84
126
|
name: azure_mgmt_resources
|
85
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,7 +137,21 @@ dependencies:
|
|
95
137
|
- !ruby/object:Gem::Version
|
96
138
|
version: '0'
|
97
139
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
140
|
+
name: azure_mgmt_storage
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: activesupport
|
99
155
|
requirement: !ruby/object:Gem::Requirement
|
100
156
|
requirements:
|
101
157
|
- - ">="
|
@@ -222,6 +278,8 @@ files:
|
|
222
278
|
- lib/sitefull-cloud/provider/amazon.rb
|
223
279
|
- lib/sitefull-cloud/provider/amazon/networking.rb
|
224
280
|
- lib/sitefull-cloud/provider/azure.rb
|
281
|
+
- lib/sitefull-cloud/provider/azure/instance.rb
|
282
|
+
- lib/sitefull-cloud/provider/azure/networking.rb
|
225
283
|
- lib/sitefull-cloud/provider/base.rb
|
226
284
|
- lib/sitefull-cloud/provider/google.rb
|
227
285
|
- lib/sitefull-cloud/provider/mock.rb
|