azure-profile 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 83513864d3a8bb9b76390fa0a8409634b9fa4fc2
4
+ data.tar.gz: 88f3bbd946b474ad2cea84fe95d5ed79ec07eb1d
5
+ SHA512:
6
+ metadata.gz: 2097b9adc3fd0b75adea22695ded5ac9e7d09c8000f3120a2a8388140d6c4f6a0238ac506341535b7b1aa8c2f8191d0c74b1116fee8fb82e1001fbaf51af09d2
7
+ data.tar.gz: 09c1277275db790024f1eaef15e7d8739eddbaab34a378800f12e054046387d231addec3c58bf43758f679635c52bb4f43346202fe87eedb680e4719154607a9
data/CHANGES ADDED
@@ -0,0 +1,2 @@
1
+ = 1.0.0 - 13-May-2015
2
+ * Initial release
@@ -0,0 +1,11 @@
1
+ CHANGES
2
+ MANIFEST
3
+ README
4
+ Rakefile
5
+ azure-profile.gemspec
6
+ lib/azure/profile.rb
7
+ lib/azure/profile/subscription.rb
8
+ spec/azure_profile_spec.rb
9
+ spec/azure_subscription_spec.rb
10
+ spec/azureProfile.json
11
+ spec/azure.publishsettings
data/README ADDED
@@ -0,0 +1,93 @@
1
+ = Description
2
+ A library for gathering Azure profile information.
3
+
4
+ = Prerequisites
5
+ * openssl
6
+ * json
7
+ * nokogiri
8
+
9
+ = Installation
10
+ gem install azure-profile
11
+
12
+ = Synopsis
13
+ require 'azure/profile'
14
+
15
+ # Assumes ~/.azure/azureProfile.json exists
16
+ prof = Azure::Profile.new
17
+
18
+ # Uses an existing publish settings file
19
+ prof = Azure::Profile.new(:settings_file => '/path/to/publishsettingsfile')
20
+
21
+ # Or the content of a settings file
22
+ prof = Azure::Profile.new(:content => IO.read('/path/to/settingsfile'))
23
+
24
+ p prof.subscriptions
25
+ p prof.default_subscription
26
+
27
+ # Using azure-profile in conjunction with the azure gem
28
+ require 'azure'
29
+ require 'azure/profile'
30
+
31
+ prof = Azure::Profile.new
32
+ dsub = prof.default.subscription
33
+
34
+ # The azure gem currently demands a file
35
+ pem_file = File.expand_path("~/.azure/azure.pem")
36
+
37
+ unless File.exists?(pem_file)
38
+ File.open(pem_file, 'w'){ |fh| fh.write dsub.management_certificate }
39
+ end
40
+
41
+ Azure.configure do |config|
42
+ config.management_certificate = pem_file
43
+ config.subscription_id = dsub.subscription_id
44
+ config.management_endpoint = dsub.management_endpoint
45
+ end
46
+
47
+ = Details
48
+ The azure-profile gem gathers and wraps your Azure subscription information.
49
+ Specifically, it will parse information out of your azureProfile.json file
50
+ if present. Alternatively, you can have it use a publishsettings file instead.
51
+
52
+ With that information you can pass the credentials of the subscription of
53
+ your choice to whatever Azure interface you're using, such as the azure gem.
54
+
55
+ = Getting a publishsettings file
56
+ If you want to download a publishsettings file, point your browser at:
57
+
58
+ https://manage.windowsazure.com/publishsettings/index
59
+
60
+ Login if you're not already logged in, and it should start a file download.
61
+ I recommend putting that file in $HOME/.azure and naming it
62
+ "azure.publishsettings" for future convenience.
63
+
64
+ If you're a powershell user, you can do Get-AzurePublishSettingsFile instead.
65
+
66
+ A publishsettings file is a simple XML file, so feel free to inspect it
67
+ at your convenience.
68
+
69
+ = Getting an azureProfile.json file
70
+ If you've installed and used the cross-platform command line interface, then
71
+ you should already have this file. If not, the best way to get one is to install
72
+ and login using the command line interface.
73
+
74
+ http://azure.microsoft.com/en-us/documentation/articles/xplat-cli/
75
+
76
+ = Future Plans
77
+ Allow the option to specify a username and password to automatically
78
+ retrieve a publishsettings file if one isn't found.
79
+
80
+ = Acknowledgements
81
+ This library possible courtesy of Red Hat, Inc.
82
+
83
+ = License
84
+ Artistic 2.0
85
+
86
+ == Warranty
87
+ This library is provided "as is" and without any express or
88
+ implied warranties, including, without limitation, the implied
89
+ warranties of merchantability and fitness for a particular purpose.
90
+
91
+ = Authors
92
+ * Daniel Berger
93
+ * Bronagh Sorota
@@ -0,0 +1,29 @@
1
+ require 'rake'
2
+ require 'rake/clean'
3
+ require 'rake/testtask'
4
+
5
+ CLEAN.include('**/*.tar', '**/*.zip', '**/*.gz', '**/*.bz2')
6
+ CLEAN.include('**/*.rbc', '**/*.gem', '**/*.tmp')
7
+
8
+ namespace 'gem' do
9
+ desc 'Create the azure-profile gem'
10
+ task :create => [:clean] do
11
+ require 'rubygems/package'
12
+ spec = eval(IO.read('azure-profile.gemspec'))
13
+ Gem::Package.build(spec)
14
+ end
15
+
16
+ desc 'Install the azure-profile gem'
17
+ task :install => [:create] do
18
+ file = Dir["*.gem"].first
19
+ sh "gem install -l #{file}"
20
+ end
21
+ end
22
+
23
+ Rake::TestTask.new do |t|
24
+ t.test_files = ['spec/*.rb']
25
+ t.verbose = true
26
+ t.warning = true
27
+ end
28
+
29
+ task :default => :test
@@ -0,0 +1,27 @@
1
+ require 'rubygems'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'azure-profile'
5
+ spec.version = '1.0.0'
6
+ spec.authors = ['Daniel J. Berger', 'Bronagh Sorota']
7
+ spec.license = 'Artistic 2.0'
8
+ spec.homepage = 'http://github.com/djberg96/azure-profile'
9
+ spec.summary = 'An interface for Azure authentication information'
10
+ spec.test_file = 'spec/azure_profile_spec.rb'
11
+ spec.files = Dir['**/*'].delete_if{ |item| item.include?('git') }
12
+
13
+ spec.extra_rdoc_files = ['CHANGES', 'README', 'MANIFEST']
14
+
15
+ spec.add_dependency('json')
16
+ spec.add_dependency('nokogiri')
17
+
18
+ spec.add_development_dependency('rspec')
19
+ spec.add_development_dependency('rake')
20
+
21
+ spec.description = <<-EOF
22
+ This is a simple Ruby interface for gathering authentication and
23
+ subscription information for Windows Azure. It will automatically
24
+ gather subscription information based on a publishsettings file or
25
+ an azureProfile.json file.
26
+ EOF
27
+ end
@@ -0,0 +1,213 @@
1
+ require_relative 'profile/subscription'
2
+
3
+ module Azure
4
+ class Profile
5
+ # The version of the azure-profile library
6
+ VERSION = '1.0.0'
7
+
8
+ # The raw content of your publishsettings file
9
+ attr_accessor :content
10
+
11
+ # The path to your publishsettings file
12
+ attr_accessor :settings_file
13
+
14
+ # The path to your azureProfile.json file
15
+ attr_accessor :json_file
16
+
17
+ # Username for use with publishsettings file retrieval
18
+ attr_accessor :username
19
+
20
+ # Password for use with publishsettings file retrieval
21
+ attr_accessor :password
22
+
23
+ # A list of subscriptions associated with your profile
24
+ attr_reader :subscriptions
25
+
26
+ # Creates and returns a new Azure::Profile object. This will attempt to
27
+ # gather subscription information based on the options you pass to it.
28
+ #
29
+ # If you pass no options it will attempt to use the relevant environment
30
+ # variables to gather information. Specifically, it will look for the
31
+ # AZURE_MANAGEMENT_CERTIFICATE, AZURE_MANAGEMENT_ENDPOINT and the
32
+ # AZURE_SUBSCRIPTION_ID environment variables.
33
+ #
34
+ # If any of those are not set, or if you specify the :json_file option, it
35
+ # will try to read and parse your azureProfile.json file. By default it
36
+ # will look for this file in $HOME/.azure, but you may specify a different
37
+ # directory.
38
+ #
39
+ # If you pass the :settings_file option, it will use nokogiri to parse
40
+ # your publishsettings file. You must include the full path if you use
41
+ # this option.
42
+ #
43
+ # If you pass the :content option, which can be a string or an IO object,
44
+ # it will parse the the content as a string. This assumes XML format.
45
+ #
46
+ # FUTURE PLANS
47
+ #
48
+ # If you pass the :username and :password options, then it will attempt
49
+ # to download a publishsettings file from Microsoft to your $HOME/.azure
50
+ # directory, and will then parse that.
51
+ #
52
+ # Examples:
53
+ #
54
+ # require 'azure/subscription'
55
+ #
56
+ # # Default to using env variables or json file.
57
+ # prof = Azure::Profile.new
58
+ # p prof.subscriptions
59
+ #
60
+ # # Use a publishsettings file
61
+ # prof = Azure::Profile.new(:settings_file => "/Users/foo/azure.publishsettings")
62
+ # p prof.subscriptions
63
+ #
64
+ # # Use your MS credentials
65
+ # prof = Azure::Profile.new(:username => 'foo', :password => 'xxxxx')
66
+ # p prof.subscriptions
67
+ #
68
+ # # Pass a string or IO object
69
+ # prof = Azure::Profile.new(:content => IO.read("/Users/foo/azure.publishsettings"))
70
+ # prof = Azure::Profile.new(:content => File.open("/Users/foo/azure.publishsettings"))
71
+ #
72
+ def initialize(options = {})
73
+ @settings_file = options[:settings_file]
74
+ @json_file = options[:json_file] || "~/.azure/azureProfile.json"
75
+ @username = options[:username]
76
+ @password = options[:password]
77
+ @content = options[:content]
78
+
79
+ @subscriptions = []
80
+
81
+ env = get_env_info
82
+
83
+ @subscriptions << env if env
84
+
85
+ if @settings_file
86
+ @subscriptions << parse_settings(@settings_file)
87
+ elsif @content
88
+ @subscriptions << parse_settings(@content, false)
89
+ else
90
+ @subscriptions << parse_json_info
91
+ end
92
+
93
+ @subscriptions.flatten!
94
+ end
95
+
96
+ # Return the default subscription for the profile.
97
+ def default_subscription
98
+ @subscriptions.detect{ |s| s.default }
99
+ end
100
+
101
+ private
102
+
103
+ # Look for relevant environment variables. If they're found, then
104
+ # create a Subscription object using those.
105
+ #
106
+ def get_env_info
107
+ sub = nil
108
+
109
+ if ENV['AZURE_MANAGEMENT_CERTIFICATE'] ||
110
+ ENV['AZURE_MANAGEMENT_ENDPOINT'] ||
111
+ ENV['AZURE_SUBSCRIPTION_ID']
112
+ then
113
+ sub = Subscription.new
114
+ sub.subscription_id = ENV['AZURE_SUBSCRIPTION_ID']
115
+ sub.management_certificiate = ENV['AZURE_MANAGEMENT_CERTIFICATE']
116
+ sub.management_endpoint = ENV['AZURE_MANAGEMENT_ENDPOINT']
117
+ sub.source = "environment variables"
118
+ end
119
+
120
+ sub
121
+ end
122
+
123
+ # Parses a publishsettings file, or the raw XML.
124
+ #
125
+ def parse_settings(data, file = true)
126
+ require 'nokogiri'
127
+ require 'openssl'
128
+ require 'base64'
129
+
130
+ if file
131
+ doc = Nokogiri::XML(File.open(data))
132
+ else
133
+ doc = Nokogiri::XML(data)
134
+ end
135
+
136
+ xml = doc.xpath("//PublishData//PublishProfile//Subscription")
137
+
138
+ sub = Subscription.new
139
+
140
+ sub.management_endpoint = xml.attribute('ServiceManagementUrl').value
141
+ sub.subscription_id = xml.attribute('Id').value
142
+ sub.subscription_name = xml.attribute('Name').value
143
+ sub.default = true
144
+
145
+ if file
146
+ sub.source = @settings_file
147
+ else
148
+ sub.source = 'external'
149
+ end
150
+
151
+ raw = xml.attribute('ManagementCertificate').value
152
+ pkcs = OpenSSL::PKCS12.new(Base64.decode64(raw))
153
+ sub.management_certificate = pkcs.certificate.to_pem + pkcs.key.to_pem
154
+
155
+ sub
156
+ end
157
+
158
+ # Parses the Azure json profile file. This file should exist if you've
159
+ # ever used the command line interface.
160
+ #
161
+ def parse_json_info
162
+ require 'json'
163
+
164
+ data = IO.read(File.expand_path(@json_file))
165
+ json = JSON.parse(data, :create_additions => false)
166
+
167
+ array = []
168
+
169
+ if json['subscriptions']
170
+ json['subscriptions'].each{ |sub|
171
+ array << Subscription.new do |s|
172
+ s.source = @json_file
173
+ s.subscription_id = sub['id']
174
+ s.subscription_name = sub['name']
175
+ s.default = sub['isDefault'] || false
176
+ s.environment_name = sub['environmentName']
177
+ s.management_endpoint = sub['managementEndpointUrl']
178
+ s.registered_providers = sub['registeredProviders']
179
+ s.management_certificate = sub['managementCertificate']['cert'] +
180
+ sub['managementCertificate']['key']
181
+ end
182
+ }
183
+ end
184
+
185
+ array
186
+ end
187
+ end
188
+ end
189
+
190
+ if $0 == __FILE__
191
+ prof = Azure::Profile.new
192
+ dsub = prof.default_subscription
193
+
194
+ require 'azure'
195
+
196
+ # At the moment, the azure gem doesn't accept a string
197
+ pem_file = File.expand_path('~/.azure/azure.pem')
198
+
199
+ unless File.exists?(pem_file)
200
+ File.open(pem_file, 'w'){ |fh| fh.write dsub.management_certificate }
201
+ end
202
+
203
+ Azure.configure do |config|
204
+ config.subscription_id = dsub.subscription_id
205
+ config.management_certificate = pem_file
206
+ config.management_endpoint = dsub.management_endpoint
207
+ end
208
+
209
+ vms = Azure::VirtualMachineManagementService.new
210
+ vm = vms.get_virtual_machine('win2k8-test1', 'win2k8-test1')
211
+
212
+ p vm
213
+ end
@@ -0,0 +1,70 @@
1
+ module Azure
2
+ class Profile
3
+ # A class that represents an invididual subscription with an Azure profile.
4
+ class Subscription
5
+ # Azure subscription ID.
6
+ attr_accessor :subscription_id
7
+
8
+ # Azure subscription name, e.g. "Free Trial"
9
+ attr_accessor :subscription_name
10
+
11
+ # Azure certificate, a combination of the cert + key
12
+ attr_accessor :management_certificate
13
+
14
+ # Returns whether or not this is a default subscription
15
+ attr_accessor :default
16
+
17
+ # An array of registered providers
18
+ attr_accessor :registered_providers
19
+
20
+ # Azure environment name, e.g. "AzureCloud"
21
+ attr_accessor :environment_name
22
+
23
+ # Azure endpoint. The default is https://management.core.windows.net
24
+ attr_accessor :management_endpoint
25
+
26
+ # The source of the subscription, e.g. "~/.azure/azureProfile.json"
27
+ attr_accessor :source
28
+
29
+ DEFAULT_MANAGEMENT_ENDPOINT = "https://management.core.windows.net"
30
+
31
+ # Creates and returns a new Subscription object. If a block is given
32
+ # then the object is yielded to the block.
33
+ #
34
+ # Example:
35
+ #
36
+ # # These values are for demonstration purposes only
37
+ # Subscription.new do |s|
38
+ # s.subscription_id = 'abc-123-xyz'
39
+ # s.subscription_name = 'My Subscription'
40
+ # s.source = 'me'
41
+ # s.default = false
42
+ # s.management_certificate = generate_my_cert(Etc.getlogin)
43
+ # s.environment_name = 'MyEnvironment'
44
+ # end
45
+ #
46
+ # If no :management_endpoint is provided, then it will default to using
47
+ # Subscription::DEFAULT_MANAGEMENT_ENDPOINT. If no :source is provided,
48
+ # then it will default to 'ruby'. If no :default is provided, it will
49
+ # default to false. If no :environment_name is provided, it will default
50
+ # to 'AzureCloud'.
51
+ #
52
+ # There is no default for the :registered providers or
53
+ # :management_certificate accessors. You must provide those. The certificate
54
+ # should be a combination of the cert and key so that you can pass its value
55
+ # directly to another interface, such as the azure gem.
56
+ #
57
+ # Note that you will not normally create Subscription objects directly.
58
+ # The Azure::Profile class will generate them and pass them back to you.
59
+ #
60
+ def initialize
61
+ yield self if block_given?
62
+
63
+ @management_endpoint ||= DEFAULT_MANAGEMENT_ENDPOINT
64
+ @source ||= 'ruby'
65
+ @default ||= false
66
+ @environment_name ||= 'AzureCloud'
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <PublishData>
3
+ <PublishProfile
4
+ SchemaVersion="2.0"
5
+ PublishMethod="AzureServiceManagementAPI">
6
+ <Subscription
7
+ ServiceManagementUrl="https://management.core.windows.net"
8
+ Id="b135322f-9d7e-4975-1234-237b85343c3c"
9
+ Name="Free Trial"
10
+ ManagementCertificate="MIIJ/AIBAzCCCbwGCSqGSIb3DQEHAaCCCa0EggmpMIIJpTCCBe4GCSqGSIb3DQEHAaCCBd8EggXbMIIF1zCCBdMGCyqGSIb3DQEMCgECoIIE7jCCBOowHAYKKoZIhvcNAQwBAzAOBAg/F/2gr4CTSwICB9AEggTIt3EhtFnYzBg6fbzSAyFxSegU324TXqSQLmbai0X+jpm95JBgZmt/1ykhHW8AziaYa8DsEL7oz5XRJe+4Co2TRE5YuRU3FvNWntK8WZXxH/n/tnx7d6MLPa2EzwxSHw3cVTaCzY5l/ud7gwwF8lu5MyfXIyBqsHWFqFvvXJKZQVJF8IammBG11Z7ocazcj2XSsqt1F71aXNBrbmuhL5/qJ1GH5QW206x8M5fm9qLsoEGJq7jAupPOlK0FvYJVfjuSYduSYAQHTpqmDBErWVhoKL9KRO57O+P6iPps0QUdpkDjuxVxokTDOfqOM/bEFARui3+Mcwa6/rGzvtvVZ25m1Xc9ItYr3uY0M+NfxfRGrDxuUx6ZEHwCbW0BMBL1zfczZjYCXp4iqK4qcljtDKpkCFlcz1+rEBr9lOyZD0mECfKvX/hfVTU/kCftp3Rqu+lG4VA32AKZWRsZw3TS5hmu4dqfWQ2CB772blI0Q6/NtAGhLe1D1CphA8/foFZbSPgBI5RJo01P66MWNnHI+9qIk7lyfXD3vDkDlZDDXnuJhNTbECNMZnxxJSie1vkVFTkkDkztG1WyM11WZtcfCZvak+5NyHcy+vyCV5hzIhmuzBSVPpC3jaIlpZpDEDZkC6vijQlzWu99Gep78FpU/eazDDkkVJG7BiMRyLlbMF5T0ilfjFI03JAhFqHKLtjct2mU+7TLDcLMqytYSK/ve6j0M6X9Ks3xyKJI5b8eulaHjIYvF791LeNH9EbCXrgmtDOlEE29tMdUu7r1eKu4kpRAcsup606jvTvQEMq3JnI/uJ7KTZ/EndtHrMUHWPzNt2IKViSCTcjT8XBWUPA6V6t/zMIKMD5oaqgclsZI8kXBAEUZhPm6Xsml5RGDtDos4/t/fYSjDw6ucD9H5BZUQtc7OZsZi9IIuwLGvjod5beiZpFIvR7JVJUozbDNc+uHfv+SPoIxX779gH2dlSwMbx/cyF/x3MKAEirkIl+pA9x204D0NW9i8AxdYVQAOJN95L6fvEFtwODfLkk/I45N8S5XegUndzpP57axOCD2BPl37HELCL2y1WR6bXWnqBEpDm/XZ6iGorTL2ijXxc+9QRP+QXLyWAIiDqseMd9LRH4ctaONaAEWR5wzoU4OlqkbeewMXtYWzWWmUEHOLkyALZOilWN/h19hAPmXGSKPnZ3koFdixPv2+2nlbgGYU8iCxfCG8gH27W+wvuFy21MySkDvH+fvr5RA3vlahtBGD1q4UjheAVroFCES3CiAUD/8ps9dtys+0UKNCakJyVgyuq8dxlChf/7rMHrBiNWTb7aaMChoI/3BiHvhptBFZfHM+E07qjRnD2It5dmwOYpvfJPVkIIXBssylIpdJ8BFHML+flPkYrXKfkSyu9ilfqquvNLwEBSjqXLVb7PdybOpQTDRkAC1k40x8NYcUyvY3OefNrmhlptoWVv3vXfDK7d2b1fm4W8DW0XZYYb1we/uwRwDvp+421ibNl1KiraEefWMJ/l0bUm0GITw8Q1twVylvttUpl5G2R8E0rHXsEv7jEjgfncL23DMALVekSVsRn6UJJoN5fXcgQPS2q7ZFio3ymfUR6dNfGGdh87hk0NSXlSCfQXP2+uTaF4wMYHRMBMGCSqGSIb3DQEJFTEGBAQBAAAAMFsGCSqGSIb3DQEJFDFOHkwAewA3AEYAMQAyADQANABFAEEALQBCADEANAA3AC0ANABBAEIARAAtAEEARQAxADMALQA3ADQAOQA3ADMAMQA0AEEAMAA4AEEAQgB9MF0GCSsGAQQBgjcRATFQHk4ATQBpAGMAcgBvAHMAbwBmAHQAIABTAG8AZgB0AHcAYQByAGUAIABLAGUAeQAgAFMAdABvAHIAYQBnAGUAIABQAHIAbwB2AGkAZABlAHIwggOvBgkqhkiG9w0BBwagggOgMIIDnAIBADCCA5UGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEGMA4ECD+Wvx/7AeDyAgIH0ICCA2haNjUsHlNVF/BSRcth0Z4rGxu/RTTJelQUQWWRGfjzcU7K/22SCgR9ttg2tgJkqzzf0xCMhEhRdaYr3cSQOx3dGsbX3Q70plsNcQ7DLe2hn748bycifDcxEfrbVsGFCygeN4ta1riiYPpm6NFwm0nTt8NJKfOuD0xRdHow5tB+heUik9egPU1imYjLfsijdPMfM+/8OIbFNkKZGDwT63CesFDecFMgS2F4dnTzPYS4/8YO2gycJYqp11DQZZyprPXWgASK3w//wlTDUnci15V7fK3lZDN9+BtYzWLQH6L47vMQ8DZBumDIOoWLLaI3a3ocIype/XFc0nWnzV5BEDXE96NoIcBJe5cmDM8NRsrMFcTxGZdMIkWyYAKdQp+Br9pmbmZPeCBwqhDx7wvW45/VPAkamiRAMoLGI/2aIDY99I3Jnp8xL8QpFUC2ZmM2CtSsrl7FbLfuG7NsPjBfCXNsPBezHeYCFakZPT0id5fHWXQdZaHzWJAvK3xbaBJPZxfU81FJcP1nYUfcHuOBvy1nhNaU68aJgiSSudGER5000KZ/MMhCXcxy1noT1LnRjPsLRImoFcem3RCinIWZpTzw8ufYAnzJxL4+zlno4On9MqPTXaYGsd3twaofhbMjG/6UYAcmv9elEM8CaWnvlsYVmYnqRDGWHB+MHlgKLF7VNaRYWn3SJyB1tOC2joVqWbO3LorrnsJ7as/BYIAnc7h1YnWXMDovyY0vPNijbUhjJVBLypL63WLtbX800xZOOPbk3Grx0fUbCc7Zvmw93ISizf8qVV0LeD85wljLyPBKQMNHIch/4LeDc+Fw+6WCEvW0qkdjU8c1RtRlkmK94T55h42VdQOAubnUiTA2e0+XdQjkGVxOZv53RWbwKY1R5/uObJ1r8niyV4ghghK7AX737SyBt6M7f1wn9iYxVg1EfNzt3oPubjRrgwVDCWV4gQkS9uc+tIB/vH0jiFjgpKHvQX3fZZo3W57NmREEdB8UQYeAr6wyZU6IYNHH4+Yx5mL6+c4ACNsWMRghDHUioPQfwTD4z7bIQjvEWUiKU3YABj3SuoZ+IStZ5zY0/4yZxAXJX47MSMVnmn5zVafnDwQU3OycBelItHI+Sx3kP5N9ZoOqEOKysg6t0RMBmU1EyOIzhDWRDPU18TA3MB8wBwYFKw4DAhoEFHJuwBM5CpLQtyvDGy/AvcOOUe+TBBTjDoFbu/2j1ICG8mVbCHN8lhB7XQ==" />
11
+ </PublishProfile>
12
+ </PublishData>
@@ -0,0 +1,17 @@
1
+ {
2
+ "environments": [],
3
+ "subscriptions": [
4
+ {
5
+ "id": "b135322f-9d7e-4975-1234-237b85343c3c",
6
+ "name": "Free Trial",
7
+ "managementCertificate": {
8
+ "key": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAtIdOgHPrIY/0miErcP7HsafhDVYS/kFMVbqKdeaoNot8Dg+9\r\ngL73+593TUHPspbRlRJ3+84ONQwE7am3HVk/SkudgptSZSn5P9gS+W+X4SKO4FG5\r\n0Mc4sNgnx8JMtGhYPTk4CTXVRju7gCZFsvtWPWx8uCCEHCszC+JZYMspNvs2Shzy\r\nTYb1C3mLmbJf9y/uTIggQpZnq8/TJZanadL+yGGFaP6bmqyHb4mx9gn5sk0tF1/Q\r\nr+HeFag6jwVbiwuIFIVDWqvsFjJ6VHunQcNLe9t5pEMjfpnPJkQ8geYNVLcwvU0w\r\neHgKe9N4YO9+VCJKxvgWMq41Rw99xw0M1RgdUQIDAQABAoIBABYxXJGOvoj8lha1\r\nDW65iYHR6CkgK9tRGnHfCeq60XLMJLLjVTnssBZhKRTIqoBzST5E3BZq40T67mer\r\noZjUagMHhuxhjQhl96/VL6b1pKOPAKa7sUbE2PeniQNmA9E5UyCqpjR+p1J4ISGc\r\nwtyBCJ3qNm5Zw/flCSRUvgVX0GAjXlyzjRLR6TbHYgCa4UmQg/nK8z6XR821HnrG\r\n6QVYZ7qkWTi1o9XDwl0lt6I65c5vx+CW9CoWhpjMk/RBQMDWbaUhwgw09xveXyRo\r\n3G2yClPnN+yO4DZ+jj9IeAZ4y4fdHbnXc+KiulNIxFY2v1933APKoESlVFtIBT+p\r\nZ4hybYkCgYEAwAv3dMq90/i0Zdjs3jiNXaayW2zURfu435VkdVmBIpOBDMEorPZU\r\n/gPjTW/IQxzn4S4SFpL1b3vQyGBknqzwMFInOTmZovkDcP8Hclfy4Fg1N+PAoiwX\r\n/js0Qy6iXzgZFyx3Icu/XaQwOqBe7hQcp7/bu01QChgo9c1wsByicpkCgYEA8KVp\r\nChN5Wk9j0sbXHx/efNODmvI4VpoJRjSkxF86RM8D7b+7IOSxAulcj/BXP2R8sWCW\r\ntdV8s3J+l0HPOnrHsQN5PskdFD/e72FowcVBADrS7Rs0y2bwGYmQyc2zE1idv1uN\r\nNa4GSHjt12CgBPD0SMEAoyjnF2le3tOTOoX6a3kCgYAWEwoNjaRGMiciMc4AOQXe\r\nxuNnaNn5dVaptHVIm9IhFE1YFvfC8cmRLQc6hmfBdxgcJPyFRb0aZGP6NEI8jupI\r\n05iYlktXlUHVAitr9DoBmYH8e5xPx7u2SD3Ynwqg4UTZCg5jfxTvAYldo8NloEAu\r\n8/mgzOEvV9mVb1jNlW0CuQKBgQCjnAIvLJBL+z/mFPQ7IAK3IWMPnHD7SBzYE4CW\r\nVhwanhiQstM6COHkFd6tqfzXh61TN1Uf6TawFj7E/aQzoThVPARZ0IgptUcPv01m\r\nuIJ58oRnWiDpzWGeKy46VdTTaWNOr6LxBREWgslJrlL9KQkc0cNqKqv6+dPbcUNe\r\n/aoFGQKBgEeXYDpEC11Y+WHaPWx/oRP2aMh9lSbRHINNdcc6uGSS9ywTb+ObJVgg\r\nYhjAZ04pb9wZLSmLLt2NDBC3OEIMl920Ah2OxVWNbvuglubqmtcdBJtCbyFDtfhr\r\nrHujJHJ+F4VSwo/fdHmVg53LG3Pdacte/IydqOp6SkcZS30ZPn/w\r\n-----END RSA PRIVATE KEY-----\n",
9
+ "cert": "-----BEGIN CERTIFICATE-----\nMIICxDCCAaygAwIBAgIQY4/XKHqDZo5JR5QZ8BHXCTANBgkqhkiG9w0BAQUFADAe\r\nMRwwGgYDVQQDExNXaW5kb3dzIEF6dXJlIFRvb2xzMB4XDTE1MDUwNjEzNDkyOFoX\r\nDTE2MDUwNjEzNDkyOFowHjEcMBoGA1UEAxMTV2luZG93cyBBenVyZSBUb29sczCC\r\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALSHToBz6yGP9JohK3D+x7Gn\r\n4Q1WEv5BTFW6inXmqDaLfA4PvYC+9/ufd01Bz7KW0ZUSd/vODjUMBO2ptx1ZP0pL\r\nnYKbUmUp+T/YEvlvl+EijuBRudDHOLDYJ8fCTLRoWD05OAk11UY7u4AmRbL7Vj1s\r\nfLgghBwrMwviWWDLKTb7Nkoc8k2G9Qt5i5myX/cv7kyIIEKWZ6vP0yWWp2nS/shh\r\nhWj+m5qsh2+JsfYJ+bJNLRdf0K/h3hWoOo8FW4sLiBSFQ1qr7BYyelR7p0HDS3vb\r\neaRDI36ZzyZEPIHmDVS3ML1NMHh4CnvTeGDvflQiSsb4FjKuNUcPfccNDNUYHVEC\r\nAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAMlUjsEp2X/jW7EZUH00xV0x90sfaRtcv\r\nPStfCmSbwtmjE4z3fHbUUFHEnvPCq5Y9CQxfoyYDMiOpQJ+dmD6RcKeGLAHgrLq3\r\n60K7NkbD5kxbAa3l3K3JN/M0w5HFmHt0vjLfykPy76eE2RtyOVkb0f/klASWc1Oy\r\nNw05PuVFgXKU7PSnIbGknHC8MnBeGOcpPDdxGk3hplfx5cqThdZn122nrtbFgovM\r\n0u3FZVarHftlFH4L2hp6G4NUaVzkxgj7VYTEqwbD+ahP6iaqa0d3a++q0Py/hcld\r\n8anOrg5W+my2P/q0iAUOcOQ8iFfvbU5pAueEtgw8VVUfaYWOUX8czQ==\n-----END CERTIFICATE-----\n"
10
+ },
11
+ "isDefault": true,
12
+ "registeredProviders": [],
13
+ "environmentName": "AzureCloud",
14
+ "managementEndpointUrl": "https://management.core.windows.net"
15
+ }
16
+ ]
17
+ }
@@ -0,0 +1,63 @@
1
+ #########################################################
2
+ # azure_profile_spec.rb
3
+ #
4
+ # Specs for the Azure::Profile class.
5
+ #########################################################
6
+ require 'rspec/autorun'
7
+ require 'azure/profile'
8
+
9
+ describe "profile" do
10
+ before(:all) do
11
+ @json_file = File.join(File.dirname(__FILE__), 'azureProfile.json')
12
+ @settings_file = File.join(File.dirname(__FILE__), 'azure.publishsettings')
13
+ end
14
+
15
+ it "has a VERSION constant set to the expected value" do
16
+ Azure::Profile::VERSION.should eq("1.0.0")
17
+ end
18
+
19
+ after(:all) do
20
+ @json_file = nil
21
+ @settings_file = nil
22
+ end
23
+
24
+ context "using publishsettings file" do
25
+ before(:all) do
26
+ @profile = Azure::Profile.new(:settings_file => @settings_file)
27
+ end
28
+
29
+ it "has a settings_file accessor and it is set to the expected value" do
30
+ @profile.should respond_to(:settings_file)
31
+ @profile.settings_file.should eq(@settings_file)
32
+ end
33
+
34
+ it "sets the default subscription" do
35
+ @profile.should respond_to(:default_subscription)
36
+ @profile.default_subscription.should be_kind_of(Azure::Profile::Subscription)
37
+ end
38
+
39
+ after(:all) do
40
+ @profile = nil
41
+ end
42
+ end
43
+
44
+ context "using json file" do
45
+ before(:all) do
46
+ @profile = Azure::Profile.new(:json_file => @json_file)
47
+ end
48
+
49
+ it "has a json_file accessor and it is set to the expected value" do
50
+ @profile.should respond_to(:json_file)
51
+ @profile.json_file.should eq(@json_file)
52
+ end
53
+
54
+ it "sets the default subscription" do
55
+ @profile.should respond_to(:default_subscription)
56
+ @profile.default_subscription.should be_kind_of(Azure::Profile::Subscription)
57
+ end
58
+
59
+ after(:all) do
60
+ @profile = nil
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,65 @@
1
+ #########################################################
2
+ # azure_subscription_spec.rb
3
+ #
4
+ # Specs for the Azure::Profile::Subscription class.
5
+ #########################################################
6
+ require 'rspec/autorun'
7
+ require 'azure/profile'
8
+
9
+ describe "subscription" do
10
+ before(:all) do
11
+ @default_endpoint = "https://management.core.windows.net"
12
+ end
13
+
14
+ before(:each) do
15
+ @sub = Azure::Profile::Subscription.new
16
+ end
17
+
18
+ it "has a subscription_id accessor" do
19
+ @sub.should respond_to(:subscription_id)
20
+ @sub.subscription_id.should be_nil
21
+ end
22
+
23
+ it "has a subscription_name accessor" do
24
+ @sub.should respond_to(:subscription_name)
25
+ @sub.subscription_name.should be_nil
26
+ end
27
+
28
+ it "has a management_certificate accessor" do
29
+ @sub.should respond_to(:management_certificate)
30
+ @sub.management_certificate.should be_nil
31
+ end
32
+
33
+ it "has a default accessor that defaults to false" do
34
+ @sub.should respond_to(:default)
35
+ @sub.default.should be_false
36
+ end
37
+
38
+ it "has a registered_providers accessor" do
39
+ @sub.should respond_to(:registered_providers)
40
+ @sub.registered_providers.should be_nil
41
+ end
42
+
43
+ it "has an environment_name accessor with a default value" do
44
+ @sub.should respond_to(:environment_name)
45
+ @sub.environment_name.should eq("AzureCloud")
46
+ end
47
+
48
+ it "has a management_endpoint accessor with a default value" do
49
+ @sub.should respond_to(:management_endpoint)
50
+ @sub.management_endpoint.should eq(@default_endpoint)
51
+ end
52
+
53
+ it "has a source accessor with a default value" do
54
+ @sub.should respond_to(:source)
55
+ @sub.source.should eq("ruby")
56
+ end
57
+
58
+ after(:each) do
59
+ @sub = nil
60
+ end
61
+
62
+ after(:all) do
63
+ @default_endpoint = nil
64
+ end
65
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: azure-profile
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel J. Berger
8
+ - Bronagh Sorota
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-05-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: nokogiri
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ description: |2
71
+ This is a simple Ruby interface for gathering authentication and
72
+ subscription information for Windows Azure. It will automatically
73
+ gather subscription information based on a publishsettings file or
74
+ an azureProfile.json file.
75
+ email:
76
+ executables: []
77
+ extensions: []
78
+ extra_rdoc_files:
79
+ - CHANGES
80
+ - README
81
+ - MANIFEST
82
+ files:
83
+ - CHANGES
84
+ - MANIFEST
85
+ - README
86
+ - Rakefile
87
+ - azure-profile.gemspec
88
+ - lib/azure/profile.rb
89
+ - lib/azure/profile/subscription.rb
90
+ - spec/azure.publishsettings
91
+ - spec/azureProfile.json
92
+ - spec/azure_profile_spec.rb
93
+ - spec/azure_subscription_spec.rb
94
+ homepage: http://github.com/djberg96/azure-profile
95
+ licenses:
96
+ - Artistic 2.0
97
+ metadata: {}
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubyforge_project:
114
+ rubygems_version: 2.4.6
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: An interface for Azure authentication information
118
+ test_files:
119
+ - spec/azure_profile_spec.rb