azure-armrest 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,50 @@
1
+ # Azure namespace
2
+ module Azure
3
+ # Armrest namespace
4
+ module Armrest
5
+ # Base class for managing availability sets.
6
+ class AvailabilitySetManager < ArmrestManager
7
+
8
+ # Create and return a new AvailabilitySetManager (ASM) instance. Most
9
+ # methods for an ASM instance will return one or more AvailabilitySet
10
+ # instances.
11
+ #
12
+ def initialize(options = {})
13
+ super
14
+
15
+ @base_url += "resourceGroups/#{@resource_group}/"
16
+ @base_url += "providers/Microsoft.Compute/availabilitySets"
17
+ end
18
+
19
+ # Creates a new availability set.
20
+ #
21
+ # TODO: The current documentation doesn't seem to list all the possible
22
+ # options at this time.
23
+ #--
24
+ def create(set_name, options = {})
25
+ url = @uri + "#{set_name}?api-version=#{api_version}"
26
+ url
27
+ end
28
+
29
+ alias update create
30
+
31
+ # Deletes the +set_name+ availability set.
32
+ def delete(set_name)
33
+ url = @uri + "#{set_name}?api-version=#{api_version}"
34
+ url
35
+ end
36
+
37
+ # Retrieves the options of an availability set.
38
+ def get(set_name)
39
+ url = @uri + "#{set_name}?api-version=#{api_version}"
40
+ url
41
+ end
42
+
43
+ # List availability sets.
44
+ def list
45
+ url = @uri + "?api-version=#{api_version}"
46
+ url
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,32 @@
1
+ module Azure
2
+ module Armrest
3
+ class EventManager < ArmrestManager
4
+
5
+ def initialize(options = {})
6
+ super
7
+
8
+ @base_url += "providers/microsoft.insights/eventtypes/management/values"
9
+ @base_url += "?api-version=#{@api_version}"
10
+ end
11
+
12
+ # check what data type the event channel is
13
+
14
+ def get_rg_events(starttime, endtime, channels, rg_name )
15
+ @uri += build_filter += " and resourceGroupName eq '#{rg_name}'"
16
+ end
17
+
18
+ def get_resource_events(starttime, endtime, channels, resource_uri )
19
+ @uri += build_filter += " and resourceUri eq '#{resource_uri}'"
20
+ end
21
+
22
+ def build_filter(starttime, endtime, channels)
23
+ "$filter=eventTimestamp ge '#{starttime}' and eventTimestamp le '#{endtime}'
24
+ and eventChannels eq '#{channels}'"
25
+ end
26
+
27
+ def select_properties(property_names)
28
+ "&$select={property_names}"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,165 @@
1
+ module Azure
2
+ module Armrest
3
+ # Class for managing storage accounts.
4
+ class StorageAccountManager < ArmrestManager
5
+
6
+ # Valid account types for the create or update method.
7
+ VALID_ACCOUNT_TYPES = %w[
8
+ Standard_LRS
9
+ Standard_ZRS
10
+ Standard_GRS
11
+ Standard_RAGRS
12
+ ]
13
+
14
+ # Creates and returns a new StorageAccountManager (SAM) instance. Most
15
+ # methods for a SAM instance will return a StorageAccount object.
16
+ def initialize(options = {})
17
+ super
18
+ end
19
+
20
+ # Return information for the given storage account name for the
21
+ # provided +group+. If no group is specified, it will use the
22
+ # group set in the constructor.
23
+ #
24
+ # Example:
25
+ #
26
+ # sam.get('portalvhdstjn1ty0dlc2dg')
27
+ # sam.get('portalvhdstjn1ty0dlc2dg', 'Default-Storage-CentralUS')
28
+ #
29
+ def get(account_name, group = @resource_group)
30
+ set_default_subscription
31
+
32
+ raise ArgumentError, "must specify resource group" unless group
33
+
34
+ @api_version = '2014-06-01'
35
+ url = build_url(@subscription_id, group, account_name)
36
+
37
+ JSON.parse(rest_get(url))
38
+ end
39
+
40
+ # Returns a list of available storage accounts for the given subscription
41
+ # for the provided +group+, or all resource groups if none is provided.
42
+ #
43
+ def list(group = @resource_group)
44
+ if group
45
+ @api_version = '2014-06-01'
46
+ url = build_url(@subscription_id, group)
47
+ JSON.parse(rest_get(url))['value'].first
48
+ else
49
+ array = []
50
+ threads = []
51
+
52
+ resource_groups.each do |group|
53
+ @api_version = '2014-06-01' # Must be set after resource_groups call
54
+ url = build_url(@subscription_id, group['name'])
55
+
56
+ threads << Thread.new do
57
+ result = JSON.parse(rest_get(url))['value'].first
58
+ array << result if result
59
+ end
60
+ end
61
+
62
+ threads.each(&:join)
63
+
64
+ array
65
+ end
66
+ end
67
+
68
+ # Creates a new storage account, or updates an existing account with the
69
+ # specified parameters. The possible parameters are:
70
+ #
71
+ # - :account_name
72
+ # Required. The name of the storage account within the specified
73
+ # resource stack. Must be 3-24 alphanumeric lowercase characters.
74
+ #
75
+ # - :validating
76
+ # Optional. Set to 'nameAvailability' to indicate that the account
77
+ # name must be checked for global availability.
78
+ #
79
+ # - :location
80
+ # Required: One of the Azure geo regions, e.g. 'West US'.
81
+ #
82
+ # - :tags
83
+ # A hash of tags to describe the resource. You may have a maximum of
84
+ # 10 tags, and each key has a max size of 128 characters, and each
85
+ # value has a max size of 256 characters.
86
+ #
87
+ # -:properties
88
+ # - :account_type
89
+ # - :custom_domains
90
+ # - :custom_domain
91
+ # - :name
92
+ # - :use_subdomain_name
93
+ #--
94
+ # PUT
95
+ #
96
+ def create(option = {})
97
+ #account_name = options.fetch(:account_name)
98
+ #location = options.fetch(:location)
99
+ validating = options[:validating]
100
+ #tags = options[:tags]
101
+
102
+ url = @uri + "/#{account_name}"
103
+
104
+ if validating
105
+ url += "?validating=nameAvailability"
106
+ end
107
+
108
+ url
109
+ end
110
+
111
+ alias update create
112
+
113
+ # Delete the given storage account name.
114
+ def delete(account_name)
115
+ url = @uri + "/#{account_name}?api-version=#{api_version}"
116
+ url
117
+ end
118
+
119
+
120
+
121
+ # Returns the primary and secondary access keys for the given
122
+ # storage account.
123
+ #--
124
+ # POST
125
+ #
126
+ def list_account_keys(account_name)
127
+ url = @uri + "/#{account_name}/listKeys?api-version=#{api_version}"
128
+ url
129
+ end
130
+
131
+ # Regenerates the primary and secondary access keys for the given
132
+ # storage account.
133
+ #--
134
+ # POST
135
+ def regenerate_storage_account_keys(account_name)
136
+ url = @uri + "/#{account_name}/regenerateKey?api-version=#{api_version}"
137
+ url
138
+ end
139
+
140
+ private
141
+
142
+ # If no default subscription is set, then use the first one found.
143
+ def set_default_subscription
144
+ @subscription_id ||= subscriptions.first['subscriptionId']
145
+ end
146
+
147
+ # Builds a URL based on subscription_id an resource_group and any other
148
+ # arguments provided, and appends it with the api-version.
149
+ def build_url(subscription_id, resource_group, *args)
150
+ url = File.join(
151
+ Azure::Armrest::COMMON_URI,
152
+ subscription_id,
153
+ 'resourceGroups',
154
+ resource_group,
155
+ 'providers',
156
+ 'Microsoft.ClassicStorage',
157
+ 'storageAccounts',
158
+ )
159
+
160
+ url = File.join(url, *args) unless args.empty?
161
+ url << "?api-version=#{@api_version}"
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,59 @@
1
+ # Azure namespace
2
+ module Azure
3
+ # Armrest namespace
4
+ module Armrest
5
+ # Base class for managing subnets
6
+ class SubnetManager < VirtualNetworkManager
7
+
8
+ # Create and return a new SubnetManager instance. Most methods for a
9
+ # SubnetManager instance will return one or Subnet instances.
10
+ #
11
+ def initialize(options = {})
12
+ super
13
+
14
+ @base_url += "/subnets"
15
+ end
16
+
17
+ # Creates a new subnet using the given +options+.
18
+ #
19
+ # The possible options are:
20
+ #
21
+ # :name
22
+ # :id
23
+ # :location
24
+ # :tags
25
+ # :etag
26
+ # :properties
27
+ # :provisioning_state
28
+ # :address_prefixes
29
+ # :dhcp_options
30
+ # :dns_servers
31
+ # :ip_configurations
32
+ #--
33
+ def create(subnet_name, options = {})
34
+ @uri += "/#{subnet_name}?api-version=#{api_version}"
35
+ end
36
+
37
+ # Deletes the given subnet.
38
+ def delete(subnet_name)
39
+ @uri += "/#{subnet_name}?api-version=#{api_version}"
40
+ end
41
+
42
+ # Retrieves information for the given subnet.
43
+ def get(subnet_name)
44
+ @uri += "/#{subnet_name}?api-version=#{api_version}"
45
+ end
46
+
47
+ # List available subnets.
48
+ def list
49
+ @uri += "?api-version=#{api_version}"
50
+ end
51
+
52
+ # Patch an existing subnet. This is similar to a create/update
53
+ # but the available options are more limited.
54
+ def patch(subnet_name, options = {})
55
+ @uri += "?api-version=#{api_version}"
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,5 @@
1
+ module Azure
2
+ module Armrest
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,59 @@
1
+ # Azure namespace
2
+ module Azure
3
+ # Armrest namespace
4
+ module Armrest
5
+ # Base class for managing virtual machine extensions
6
+ class VirtualMachineExtensionManager < VirtualMachineManager
7
+
8
+ # Creates a new virtual machine extension for +vmname+ with the given
9
+ # +extension_name+, and the given +options+. Possible options are:
10
+ #
11
+ # :tags - Optional. A list of key value pairs. Max 10 pairs.
12
+ # :publisher - Required. Name of extension publisher.
13
+ # :type - Required. The type of extension.
14
+ # :type_handler_version - Required. Specifies the extension version.
15
+ # :settings - Optional. Public configuration that does not require encryption.
16
+ # :protected_settings - Optional. Private configuration that is encrypted.
17
+ #
18
+ def create(vmname, extension_name, options = {})
19
+ #publisher = options.fetch(:publisher)
20
+ #type = options.fetch(:type)
21
+ #type_handler_version = options.fetch(:type_handler_version)
22
+
23
+ url = @uri + "/#{vmname}/extensions/#{extension_name}?#{api_version}"
24
+ url
25
+ end
26
+
27
+ alias update create
28
+
29
+ # Delete the given +extension_name+ for +vmname+.
30
+ #--
31
+ # DELETE
32
+ #
33
+ def delete(vmname, extension_name)
34
+ url = @uri + "/#{vmname}/extensions/#{extension_name}?#{api_version}"
35
+ url
36
+ end
37
+
38
+ # Retrieves the settings of an extension. If the +instance_view+ option
39
+ # is true, it will retrieve instance view information instead.
40
+ #--
41
+ # GET
42
+ #
43
+ def get(vmname, instance_view = false)
44
+ url = @uri + "/#{vmname}/extensions/#{extension_name}?"
45
+ url += "$expand=instanceView," if instance_view
46
+ url += "#{api_version}"
47
+ url
48
+ end
49
+
50
+ # Retrieves a list of extensions on the VM.
51
+ def list(vmname, instance_view = false)
52
+ url = @uri + "/#{vmname}/extensions"
53
+ url += "$expand=instanceView," if instance_view
54
+ url += "#{api_version}"
55
+ url
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,135 @@
1
+ # Azure namespace
2
+ module Azure
3
+ # Armrest namespace
4
+ module Armrest
5
+ # Base class for managing virtual machine images
6
+ class VirtualMachineImageManager < ArmrestManager
7
+ # The location used in requests when gathering VM image information.
8
+ attr_accessor :location
9
+
10
+ # The provider used in requests when gathering VM image information.
11
+ attr_reader :provider
12
+
13
+ # The publisher used in requests when gathering VM image information.
14
+ attr_accessor :publisher
15
+
16
+ # Create and return a new VirtualMachineImageManager (VMIM) instance.
17
+ #
18
+ # This subclass accepts the additional :location, :provider, and
19
+ # :publisher options as well. The default provider is set to
20
+ # 'Microsoft.Compute'.
21
+ #
22
+ def initialize(options = {})
23
+ super
24
+
25
+ @location = options[:location]
26
+ @provider = options[:provider] || 'Microsoft.Compute'
27
+ @publisher = options[:publisher]
28
+
29
+ # Typically only empty in testing.
30
+ unless @@providers.empty?
31
+ @api_version = @@providers[@provider]['locations/publishers']['api_version']
32
+ end
33
+ end
34
+
35
+ # Set a new provider to use the default for other methods. This may alter
36
+ # the api_version used for future requests. In practice, only
37
+ # 'Microsoft.Compute' or 'Microsoft.ClassicCompute' should be used.
38
+ #
39
+ def provider=(name)
40
+ @api_version = @@providers[name]['locations/publishers']['api_version']
41
+ @provider = name
42
+ end
43
+
44
+ # Return a list of VM image offers from the given +publisher+ and +location+.
45
+ #
46
+ # Example:
47
+ #
48
+ # vmim.offers('eastus', 'Canonical')
49
+ #
50
+ def offers(location = @location, publisher = @publisher)
51
+ raise ArgumentError, "No location specified" unless location
52
+ raise ArgumentError, "No publisher specified" unless publisher
53
+
54
+ url = build_url(location, 'publishers', publisher, 'artifacttypes', 'vmimage', 'offers')
55
+
56
+ JSON.parse(rest_get(url)).map{ |element| element['name'] }
57
+ end
58
+
59
+ # Return a list of VM image publishers for the given +location+.
60
+ #
61
+ # Example:
62
+ #
63
+ # vmim.publishers('eastus')
64
+ #
65
+ def publishers(location = @location)
66
+ raise ArgumentError, "No location specified" unless location
67
+
68
+ url = build_url(location, 'publishers')
69
+
70
+ JSON.parse(rest_get(url)).map{ |element| element['name'] }
71
+ end
72
+
73
+ # Return a list of VM image skus for the given +offer+, +location+,
74
+ # and +publisher+.
75
+ #
76
+ # Example:
77
+ #
78
+ # vmim.skus('UbuntuServer', 'eastus', 'Canonical')
79
+ #
80
+ def skus(offer, location = @location, publisher = @publisher)
81
+ raise ArgumentError, "No location specified" unless location
82
+ raise ArgumentError, "No publisher specified" unless publisher
83
+
84
+ url = build_url(
85
+ location, 'publishers', publisher, 'artifacttypes',
86
+ 'vmimage', 'offers', offer, 'skus'
87
+ )
88
+
89
+ JSON.parse(rest_get(url)).map{ |element| element['name'] }
90
+ end
91
+
92
+ # Return a list of VM image versions for the given +sku+, +offer+,
93
+ # +location+ and +publisher+.
94
+ #
95
+ # Example:
96
+ #
97
+ # vmim.versions('14.04.2', 'UbuntuServer', 'eastus', 'Canonical')
98
+ #
99
+ # # sample output
100
+ # => ["14.04.201503090", "14.04.201505060", "14.04.201506100", "14.04.201507060"]
101
+ #
102
+ def versions(sku, offer, location = @location, publisher = @publisher)
103
+ raise ArgumentError, "No location specified" unless location
104
+ raise ArgumentError, "No publisher specified" unless publisher
105
+
106
+ url = build_url(
107
+ location, 'publishers', publisher, 'artifacttypes', 'vmimage',
108
+ 'offers', offer, 'skus', sku, 'versions'
109
+ )
110
+
111
+ JSON.parse(rest_get(url)).map{ |element| element['name'] }
112
+ end
113
+
114
+ private
115
+
116
+ # Builds a URL based on subscription_id an resource_group and any other
117
+ # arguments provided, and appends it with the api_version.
118
+ #
119
+ def build_url(location, *args)
120
+ url = File.join(
121
+ Azure::Armrest::COMMON_URI,
122
+ subscription_id,
123
+ 'providers',
124
+ provider,
125
+ 'locations',
126
+ location
127
+ )
128
+
129
+ url = File.join(url, *args) unless args.empty?
130
+ url << "?api-version=#{api_version}"
131
+ end
132
+
133
+ end # VirtualMachineImageManager
134
+ end # Armrest
135
+ end # Azure