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 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