sitefull-cloud 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: be24ed92a5fe9baf164ba46e248e09d59574259b
4
- data.tar.gz: f0b7a997bc7ee41a8790f41cc40a73d9bd41ddc3
3
+ metadata.gz: b44374ca90cb087ee38d5b095bb8257e1ec55480
4
+ data.tar.gz: e317493fe79e7718c51baccef7594b08c6bda203
5
5
  SHA512:
6
- metadata.gz: 553ff09a15f609be220e4d87c5baeb738154cff16238eb32a9642d9580cfd9a567847b76b50d1336443beec83f38743560a1116424beed1c9ac86d99b4777750
7
- data.tar.gz: 7977afba97ec37cf6968ba4c7a1a4d91b743fb07bd97e080dd859197113a27c92b965758a75835ec2189a3da6515ef313101aab9ec786b1ff7284ede259bbe16
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 'azure_mgmt_compute'
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
- REQUIRED_OPTIONS = [:subscription_id].freeze
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
- # @connection ||= {
12
- # arm: ::Azure::ARM::Resources::ResourceManagementClient.new(credentials),
13
- # net: ::Azure::ARM::Network::NetworkResourceProviderClient.new(credentials),
14
- # compute: ::Azure::ARM::Compute::ComputeManagementClient.new(credentials)
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
- ['us']
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
- ["machine-type-#{region}"]
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
- ["image-region-#{os}"]
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
- 'network_id'
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(network_id)
35
- network_id
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
- true
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
@@ -1,5 +1,5 @@
1
1
  module Sitefull
2
2
  module Cloud
3
- VERSION = '0.0.2'
3
+ VERSION = '0.0.3'
4
4
  end
5
5
  end
@@ -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.2
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-07 00:00:00.000000000 Z
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: azure_mgmt_network
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