ohboshwillitfit 1.0.0 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3a73b0603f734bf9b868daf32fb7e95e9de171dd
4
- data.tar.gz: 44b62bc8889bb050b3539e690dd82dd9b34db8e4
3
+ metadata.gz: d4a0ab05faaceb6d40ede364306a259078f562da
4
+ data.tar.gz: bb43c4199e2394052384bcf059e9c6e38bcfa3e1
5
5
  SHA512:
6
- metadata.gz: 9bd591dd66ba07790f6d91259de62ab4f3ee8f3319b957ee0705b722f5bf58c9a78611c296ee823d207da7ee4b9dbb99a59ad1fbf94f267ef84ed4819e0e0bbf
7
- data.tar.gz: e6ac405fbf24ad26aa9bfceeaf81c765bd6c1e0999ce139c47e2dbacd95fc79345c0ca15592da6d8e6d9845a0df13337897f95c60f95a89933325a43a764bb11
6
+ metadata.gz: 00d65e6fcce97032220d9b33794a0a40c8393c04347c69f40628d5fe8270e903ca77c2d3a3e162f8e198bb7ca3f2bab7cdf2eed15c5839c4b81217630b1a8fb7
7
+ data.tar.gz: 8a8209599e2f1be2a07f83652c56bf26681090fdbdfd753be402d9d5ace3a56032b73ce937a68bb1129a252ba9322f99bc62291c7e9b6e671d6d1a91f224fe4b
@@ -0,0 +1,10 @@
1
+ # Change Log
2
+
3
+ ## v1.1
4
+
5
+ * shows volume size & volume count comparisons against quotas
6
+ * added an --ignore-invalid-flavors option
7
+
8
+ ## v1.0
9
+
10
+ * initial release
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in ohboshwillitfit.gemspec
4
4
  gemspec
5
+
6
+ group :development do
7
+ gem "guard-rspec"
8
+ end
@@ -0,0 +1,8 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/ohboshwillitfit/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
@@ -6,16 +6,19 @@ module Bosh::Cli::Command
6
6
  usage "will it fit"
7
7
  desc "check if this deployment will fit into OpenStack tenancy"
8
8
  option "--fog-key default", "Look up credentials in ~/.fog"
9
+ option "--ignore-invalid-flavors", "Do not fail if invalid flavors being used"
9
10
  def will_it_fit
10
11
  deployment_required
12
+ ignore_invalid_flavors = options[:ignore_invalid_flavors]
11
13
 
12
14
  if fog_key = options[:fog_key]
13
15
  credentials = OhBoshWillItFit::FogCredentials.load_from_file(fog_key)
14
16
  end
15
17
  fog_compute = Fog::Compute.new({provider: 'OpenStack'}.merge(credentials))
16
- limits = OhBoshWillItFit::Limits.new(fog_compute)
17
- unless limits.limits_available?
18
- say "Older OpenStacks like this do not provide current resources being used.".make_yellow
18
+ fog_volumes = Fog::Volume.new({provider: 'OpenStack'}.merge(credentials))
19
+ limits = OhBoshWillItFit::Limits.new(fog_compute, fog_volumes)
20
+ unless limits.volumes_limits_available?
21
+ say "Older OpenStacks like this do not provide current volume resources being used.".make_yellow
19
22
  say "Can only display output based on quotas, rather than unused limits."
20
23
  end
21
24
 
@@ -42,12 +45,16 @@ module Bosh::Cli::Command
42
45
  flavors.sort {|f1, f2| f1.ram <=> f2.ram}.each do |flavor|
43
46
  say " #{flavor.name}: ram: #{flavor.ram} disk: #{flavor.disk} cpus: #{flavor.vcpus}"
44
47
  end
45
- else
48
+ end
49
+
50
+ if !flavor_errors || ignore_invalid_flavors
46
51
  say "Resources used:"
47
52
  resource_totals = OhBoshWillItFit::Resource.resource_totals(resources)
53
+ display_resource "instances", resource_totals["instances"], limits.instances_available
48
54
  display_resource "ram", resource_totals["ram"], limits.ram_size_available
49
- display_resource "disk", resource_totals["disk"]
50
55
  display_resource "cpus", resource_totals["cpus"], limits.cores_available
56
+ display_resource "volumes", resource_totals["volumes"], limits.volumes_available
57
+ display_resource "disk", resource_totals["disk"], limits.volume_size_available
51
58
  end
52
59
  rescue => e
53
60
  err e.message
@@ -1,57 +1,126 @@
1
1
  module OhBoshWillItFit
2
2
  class Limits
3
- attr_reader :fog_compute
3
+ attr_reader :fog_compute, :fog_volumes
4
4
 
5
- def initialize(fog_compute)
5
+ def initialize(fog_compute, fog_volumes)
6
6
  @fog_compute = fog_compute
7
+ @fog_volumes = fog_volumes
7
8
  end
8
9
 
9
10
  def max_total_cores
10
- absolute_limits["maxTotalCores"]
11
+ compute_quotas["cores"]
11
12
  end
12
13
 
13
14
  def max_total_instances
14
- absolute_limits["maxTotalInstances"]
15
+ compute_quotas["instances"]
15
16
  end
16
17
 
17
18
  def max_total_ram_size
18
- absolute_limits["maxTotalRAMSize"]
19
+ compute_quotas["ram"]
19
20
  end
20
21
 
22
+ def max_total_volume_size
23
+ volume_quotas["gigabytes"]
24
+ end
25
+
26
+ def max_total_volumes
27
+ volume_quotas["volumes"]
28
+ end
29
+
30
+
21
31
  def total_cores_used
22
- absolute_limits["totalCoresUsed"]
32
+ compute_servers.inject(0) { |total, server| total + flavor_for_server(server).vcpus }
23
33
  end
24
34
 
25
35
  def total_instances_used
26
- absolute_limits["totalInstancesUsed"]
36
+ compute_servers.size
27
37
  end
28
38
 
29
39
  def total_ram_size_used
30
- absolute_limits["totalRAMUsed"]
40
+ compute_servers.inject(0) { |total, server| total + flavor_for_server(server).ram }
31
41
  end
32
42
 
33
- def limits_available?
34
- total_cores_used && total_instances_used && total_ram_size_used
43
+ def total_volume_size_used
44
+ @total_volume_size_used ||= volumes.inject(0) {|size, vol| size + vol.size }
45
+ end
46
+
47
+ def total_volumes_used
48
+ @total_volumes_used ||= volumes.size
49
+ end
50
+
51
+ def volumes_limits_available?
52
+ max_total_volume_size
35
53
  end
36
54
 
37
55
  def cores_available
38
- max_total_cores - (total_cores_used || 0)
56
+ max_total_cores - total_cores_used
39
57
  end
40
58
 
41
59
  def instances_available
42
- max_total_instances - (total_instances_used || 0)
60
+ max_total_instances - total_instances_used
43
61
  end
44
62
 
45
63
  def ram_size_available
46
- max_total_ram_size - (total_ram_size_used || 0)
64
+ max_total_ram_size - total_ram_size_used
65
+ end
66
+
67
+ # return nil if target OpenStack doesn't support volumes.get_quota
68
+ def volume_size_available
69
+ max_total_volume_size ? (max_total_volume_size - total_volume_size_used) : nil
70
+ end
71
+
72
+ # return nil if target OpenStack doesn't support volumes.get_quota
73
+ def volumes_available
74
+ max_total_volumes ? (max_total_volumes - total_volumes_used) : nil
75
+ end
76
+
77
+ def compute_servers
78
+ @compute_servers ||= fog_compute.servers
79
+ end
80
+
81
+ def volumes
82
+ @volumes ||= fog_volumes.volumes
83
+ end
84
+
85
+ def flavor_for_server(server)
86
+ flavor_id = server.flavor["id"]
87
+ @flavors ||= {}
88
+ @flavors[flavor_id] ||= fog_compute.flavors.get(flavor_id)
89
+ end
90
+
91
+ # {
92
+ # "metadata_items"=>128,
93
+ # "ram"=>204800,
94
+ # "floating_ips"=>10,
95
+ # "key_pairs"=>100,
96
+ # "instances"=>40,
97
+ # "security_group_rules"=>20,
98
+ # "injected_files"=>5,
99
+ # "cores"=>50,
100
+ # "fixed_ips"=>-1,
101
+ # "security_groups"=>10
102
+ # }
103
+ def compute_quotas
104
+ @compute_quotas ||= fog_compute.get_quota(current_tenant_id).data[:body]["quota_set"]
47
105
  end
48
106
 
49
- def limits
50
- @limits ||= fog_compute.get_limits
107
+ # {
108
+ # "snapshots"=>10,
109
+ # "gigabytes"=>15000,
110
+ # "volumes"=>40,
111
+ # }
112
+ def volume_quotas
113
+ @volume_quotas ||= fog_volumes.get_quota(current_tenant_id).data[:body]["quota_set"]
114
+ rescue Fog::Compute::OpenStack::NotFound
115
+ @volume_quotas = {
116
+ "snapshots"=>nil,
117
+ "gigabytes"=>nil,
118
+ "volumes"=>nil,
119
+ }
51
120
  end
52
121
 
53
- def absolute_limits
54
- limits.data[:body]["limits"]["absolute"]
122
+ def current_tenant_id
123
+ fog_compute.current_tenant["id"]
55
124
  end
56
125
 
57
126
  end
@@ -30,11 +30,13 @@ module OhBoshWillItFit
30
30
  end
31
31
 
32
32
  def self.resource_totals(resources)
33
- totals = { "ram" => 0, "disk" => 0, "cpus" => 0 }
33
+ totals = { "ram" => 0, "disk" => 0, "cpus" => 0, "instances" => 0, "volumes" => 0 }
34
34
  resources.each do |resource|
35
35
  totals["ram"] += resource.total_ram if resource.total_ram
36
- totals["disk"] += resource.total_disk if resource.total_disk
37
36
  totals["cpus"] += resource.total_cpus if resource.total_cpus
37
+ totals["disk"] += resource.total_disk if resource.total_disk
38
+ totals["instances"] += resource.size
39
+ totals["volumes"] += resource.size # one boot volume per VM
38
40
  end
39
41
  totals
40
42
  end
@@ -1,3 +1,3 @@
1
1
  module OhBoshWillItFit
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -0,0 +1,17 @@
1
+ {
2
+ "quota_set": {
3
+ "injected_file_content_bytes": 10240,
4
+ "metadata_items": 128,
5
+ "ram": 204800,
6
+ "floating_ips": 10,
7
+ "key_pairs": 100,
8
+ "id": "b166027658ad441d8baee6ec8f37f853",
9
+ "instances": 40,
10
+ "security_group_rules": 20,
11
+ "injected_files": 5,
12
+ "cores": 50,
13
+ "fixed_ips": -1,
14
+ "injected_file_path_bytes": 255,
15
+ "security_groups": 10
16
+ }
17
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "quota_set": {
3
+ "gigabytes_Volume-type--tempest-1301196564": -1,
4
+ "gigabytes_volume-type--tempest-420079685": -1,
5
+ "snapshots_standard": -1,
6
+ "volumes_ssd": -1,
7
+ "snapshots": 10,
8
+ "gigabytes_standard": -1,
9
+ "volumes_standard": -1,
10
+ "volumes_Volume-type--tempest-1474277584": -1,
11
+ "gigabytes_volume-type--tempest-342896740": -1,
12
+ "volumes_Volume-type--tempest-414041718": -1,
13
+ "id": "b166027658ad441d8baee6ec8f37f853",
14
+ "gigabytes_Volume-type--tempest-1474277584": -1,
15
+ "volumes_volume-type--tempest-1608932681": -1,
16
+ "snapshots_Volume-type--tempest-1474277584": -1,
17
+ "snapshots_ssd": -1,
18
+ "gigabytes_volume-type--tempest-1608932681": -1,
19
+ "snapshots_Volume-type--tempest-1406109096": -1,
20
+ "gigabytes_Volume-type--tempest-1406109096": -1,
21
+ "snapshots_volume-type--tempest-1608932681": -1,
22
+ "snapshots_Volume-type--tempest-1301196564": -1,
23
+ "volumes_volume-type--tempest-342896740": -1,
24
+ "gigabytes": 15000,
25
+ "gigabytes_Volume-type--tempest-636458420": -1,
26
+ "volumes_Volume-type--tempest-1301196564": -1,
27
+ "snapshots_Volume-type--tempest-636458420": -1,
28
+ "snapshots_Volume-type--tempest-1799390857": -1,
29
+ "volumes_Volume-type--tempest-1799390857": -1,
30
+ "gigabytes_Volume-type--tempest-1799390857": -1,
31
+ "volumes_volume-type--tempest-1488186639": -1,
32
+ "gigabytes_Volume-type--tempest-414041718": -1,
33
+ "volumes_Volume-type--tempest-1406109096": -1,
34
+ "snapshots_Volume-type--tempest-414041718": -1,
35
+ "snapshots_volume-type--tempest-1488186639": -1,
36
+ "snapshots_volume-type--tempest-342896740": -1,
37
+ "volumes_Volume-type--tempest-636458420": -1,
38
+ "volumes": 40,
39
+ "snapshots_volume-type--tempest-420079685": -1,
40
+ "gigabytes_ssd": -1,
41
+ "volumes_volume-type--tempest-420079685": -1,
42
+ "gigabytes_volume-type--tempest-1488186639": -1
43
+ }
44
+ }
@@ -1,81 +1,103 @@
1
1
  require "json"
2
+ require "fog/openstack/models/compute/flavor"
3
+ require "fog/openstack/models/compute/flavors"
4
+ require "fog/openstack/models/compute/server"
5
+ require "fog/openstack/models/volume/volume"
2
6
 
3
7
  describe OhBoshWillItFit::Limits do
4
- context "fog_limits - no_totals" do
5
- let(:fog_limits) { JSON.parse(File.read(spec_asset("fog_limits_no_totals.json"))) }
6
- let(:get_limits) { instance_double("Excon::Response", data: { body: fog_limits} ) }
7
- let(:fog_compute) { instance_double("Fog::Compute::OpenStack::Real", get_limits: get_limits) }
8
- subject { OhBoshWillItFit::Limits.new(fog_compute) }
9
- it {
10
- expect(subject.max_total_cores).to eq(1000)
8
+ context "quotas" do
9
+ let(:tenant) do { "id" => "tenant-id" } end
10
+ let(:servers) do
11
+ [
12
+ instance_double("Fog::Compute::OpenStack::Server", flavor: {"id" => "2"}),
13
+ instance_double("Fog::Compute::OpenStack::Server", flavor: {"id" => "3"})
14
+ ]
15
+ end
16
+
17
+ let(:small_flavor) { instance_double("Fog::Compute::OpenStack::Flavor", id: "2", ram: 2048, vcpus: 2) }
18
+ let(:medium_flavor) { instance_double("Fog::Compute::OpenStack::Flavor", id: "3", ram: 4096, vcpus: 1) }
19
+ let(:flavors) { instance_double("Fog::Compute::OpenStack::Flavors") }
20
+ before do
21
+ flavors.stub(:get).with("2").and_return(small_flavor)
22
+ flavors.stub(:get).with("3").and_return(medium_flavor)
23
+ end
24
+
25
+ let(:compute_quotas) { JSON.parse(File.read(spec_asset("quotas_compute.json"))) }
26
+ let(:compute_get_quota) { instance_double("Excon::Response", data: { body: compute_quotas } ) }
27
+ let(:fog_compute) {
28
+ instance_double("Fog::Compute::OpenStack::Real",
29
+ servers: servers,
30
+ flavors: flavors,
31
+ get_quota: compute_get_quota,
32
+ current_tenant: tenant)
11
33
  }
12
- it {
13
- expect(subject.max_total_instances).to eq(100)
34
+
35
+ let(:volumes) do
36
+ [
37
+ instance_double("Fog::Volume::OpenStack::Volume", size: 50),
38
+ instance_double("Fog::Volume::OpenStack::Volume", size: 50),
39
+ ]
40
+ end
41
+ let(:volumes_quotas) { JSON.parse(File.read(spec_asset("quotas_volumes.json"))) }
42
+ let(:volumes_get_quota) { instance_double("Excon::Response", data: { body: volumes_quotas} ) }
43
+ let(:fog_volumes) {
44
+ instance_double("Fog::Volume::OpenStack::Real",
45
+ volumes: volumes,
46
+ get_quota: volumes_get_quota)
14
47
  }
48
+
49
+ subject { OhBoshWillItFit::Limits.new(fog_compute, fog_volumes) }
50
+
15
51
  it {
16
- expect(subject.max_total_ram_size).to eq(1966080)
52
+ expect(subject.max_total_cores).to eq(50)
17
53
  }
18
54
  it {
19
- expect(subject.total_cores_used).to eq(nil)
55
+ expect(subject.max_total_instances).to eq(40)
20
56
  }
21
57
  it {
22
- expect(subject.total_instances_used).to eq(nil)
58
+ expect(subject.max_total_ram_size).to eq(204800)
23
59
  }
24
60
  it {
25
- expect(subject.total_ram_size_used).to eq(nil)
61
+ expect(subject.max_total_volume_size).to eq(15000)
26
62
  }
27
-
28
63
  it {
29
- expect(subject.limits_available?).to be_false
64
+ expect(subject.max_total_volumes).to eq(40)
30
65
  }
31
66
 
32
67
  it {
33
- expect(subject.cores_available).to eq(1000)
34
- }
35
- it {
36
- expect(subject.instances_available).to eq(100)
37
- }
38
- it {
39
- expect(subject.ram_size_available).to eq(1966080)
68
+ expect(subject.total_cores_used).to eq(3)
40
69
  }
41
- end
42
-
43
- context "fog_limits - totals" do
44
- let(:fog_limits) { JSON.parse(File.read(spec_asset("fog_limits_totals.json"))) }
45
- let(:get_limits) { instance_double("Excon::Response", data: { body: fog_limits} ) }
46
- let(:fog_compute) { instance_double("Fog::Compute::OpenStack::Real", get_limits: get_limits) }
47
- subject { OhBoshWillItFit::Limits.new(fog_compute) }
48
70
  it {
49
- expect(subject.max_total_cores).to eq(50)
71
+ expect(subject.total_instances_used).to eq(2)
50
72
  }
51
73
  it {
52
- expect(subject.max_total_instances).to eq(40)
74
+ expect(subject.total_ram_size_used).to eq(6144)
53
75
  }
54
76
  it {
55
- expect(subject.max_total_ram_size).to eq(204800)
77
+ expect(subject.total_volume_size_used).to eq(100)
56
78
  }
57
79
  it {
58
- expect(subject.total_cores_used).to eq(43)
80
+ expect(subject.total_volumes_used).to eq(2)
59
81
  }
82
+
60
83
  it {
61
- expect(subject.total_instances_used).to eq(24)
84
+ expect(subject.volumes_limits_available?).to be_true
62
85
  }
86
+
63
87
  it {
64
- expect(subject.total_ram_size_used).to eq(169472)
88
+ expect(subject.cores_available).to eq(50-3)
65
89
  }
66
-
67
90
  it {
68
- expect(subject.limits_available?).to be_true
91
+ expect(subject.instances_available).to eq(40-2)
69
92
  }
70
-
71
93
  it {
72
- expect(subject.cores_available).to eq(50-43)
94
+ expect(subject.ram_size_available).to eq(204800-6144)
73
95
  }
74
96
  it {
75
- expect(subject.instances_available).to eq(40-24)
97
+ expect(subject.volume_size_available).to eq(15000-100)
76
98
  }
77
99
  it {
78
- expect(subject.ram_size_available).to eq(204800-169472)
100
+ expect(subject.volumes_available).to eq(40-2)
79
101
  }
80
102
  end
81
103
 
@@ -27,7 +27,7 @@ describe OhBoshWillItFit::Resource do
27
27
  it { expect(subject.first.total_cpus).to eq(2) }
28
28
  it {
29
29
  totals = OhBoshWillItFit::Resource.resource_totals(subject)
30
- expect(totals).to eq({"ram" => 4096, "disk" => 24, "cpus" => 2})
30
+ expect(totals).to eq({"ram" => 4096, "disk" => 24, "cpus" => 2, "volumes" => 2, "instances" => 2})
31
31
  }
32
32
  end
33
33
  end
@@ -51,7 +51,7 @@ describe OhBoshWillItFit::Resource do
51
51
  it { expect(subject.first.total_cpus).to eq(50 * 8) }
52
52
  it {
53
53
  totals = OhBoshWillItFit::Resource.resource_totals(subject)
54
- expect(totals).to eq({"ram" => 50 * 16384, "disk" => 50 * 80, "cpus" => 50 * 8})
54
+ expect(totals).to eq({"ram" => 50 * 16384, "disk" => 50 * 80, "cpus" => 50 * 8, "volumes" => 50, "instances" => 50})
55
55
  }
56
56
  end
57
57
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ohboshwillitfit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dr Nic Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-20 00:00:00.000000000 Z
11
+ date: 2014-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog
@@ -78,7 +78,9 @@ extra_rdoc_files: []
78
78
  files:
79
79
  - ".gitignore"
80
80
  - ".rspec"
81
+ - ChangeLog.md
81
82
  - Gemfile
83
+ - Guardfile
82
84
  - LICENSE.txt
83
85
  - README.md
84
86
  - Rakefile
@@ -91,8 +93,8 @@ files:
91
93
  - ohboshwillitfit.gemspec
92
94
  - spec/assets/deployment-small.yml
93
95
  - spec/assets/deployment-wontfit.yml
94
- - spec/assets/fog_limits_no_totals.json
95
- - spec/assets/fog_limits_totals.json
96
+ - spec/assets/quotas_compute.json
97
+ - spec/assets/quotas_volumes.json
96
98
  - spec/fog_credentials_spec.rb
97
99
  - spec/limits_spec.rb
98
100
  - spec/resource_spec.rb
@@ -125,8 +127,8 @@ summary: Will this OpenStack BOSH deployment fit or not? If not, fail fast.
125
127
  test_files:
126
128
  - spec/assets/deployment-small.yml
127
129
  - spec/assets/deployment-wontfit.yml
128
- - spec/assets/fog_limits_no_totals.json
129
- - spec/assets/fog_limits_totals.json
130
+ - spec/assets/quotas_compute.json
131
+ - spec/assets/quotas_volumes.json
130
132
  - spec/fog_credentials_spec.rb
131
133
  - spec/limits_spec.rb
132
134
  - spec/resource_spec.rb
@@ -1,68 +0,0 @@
1
- {
2
- "limits": {
3
- "rate": [
4
- {
5
- "regex": ".*",
6
- "limit": [
7
- {
8
- "next-available": "2014-03-17T19:30:42Z",
9
- "unit": "MINUTE",
10
- "verb": "POST",
11
- "remaining": 9,
12
- "value": 10
13
- },
14
- {
15
- "next-available": "2014-03-20T00:56:41Z",
16
- "unit": "MINUTE",
17
- "verb": "PUT",
18
- "remaining": 10,
19
- "value": 10
20
- },
21
- {
22
- "next-available": "2014-03-18T03:47:22Z",
23
- "unit": "MINUTE",
24
- "verb": "DELETE",
25
- "remaining": 99,
26
- "value": 100
27
- }
28
- ],
29
- "uri": "*"
30
- },
31
- {
32
- "regex": "^/servers",
33
- "limit": [
34
- {
35
- "next-available": "2014-03-20T00:56:41Z",
36
- "unit": "DAY",
37
- "verb": "POST",
38
- "remaining": 50,
39
- "value": 50
40
- }
41
- ],
42
- "uri": "*/servers"
43
- },
44
- {
45
- "regex": ".*changes-since.*",
46
- "limit": [
47
- {
48
- "next-available": "2014-03-20T00:56:41Z",
49
- "unit": "MINUTE",
50
- "verb": "GET",
51
- "remaining": 3,
52
- "value": 3
53
- }
54
- ],
55
- "uri": "*changes-since*"
56
- }
57
- ],
58
- "absolute": {
59
- "maxServerMeta": 128,
60
- "maxPersonality": 5,
61
- "maxImageMeta": 128,
62
- "maxPersonalitySize": 10240,
63
- "maxTotalCores": 1000,
64
- "maxTotalInstances": 100,
65
- "maxTotalRAMSize": 1966080
66
- }
67
- }
68
- }
@@ -1,26 +0,0 @@
1
- {
2
- "limits": {
3
- "rate": [
4
-
5
- ],
6
- "absolute": {
7
- "maxServerMeta": 128,
8
- "maxPersonality": 5,
9
- "maxImageMeta": 128,
10
- "maxPersonalitySize": 10240,
11
- "maxSecurityGroupRules": 20,
12
- "maxTotalKeypairs": 100,
13
- "maxSecurityGroups": 10,
14
- "maxTotalCores": 50,
15
- "maxTotalFloatingIps": 10,
16
- "maxTotalInstances": 40,
17
- "maxTotalRAMSize": 204800,
18
-
19
- "totalSecurityGroupsUsed": 0,
20
- "totalRAMUsed": 169472,
21
- "totalInstancesUsed": 24,
22
- "totalFloatingIpsUsed": 0,
23
- "totalCoresUsed": 43
24
- }
25
- }
26
- }