ocp_registry 0.0.1.alpha
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +25 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +65 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/bin/ocp_registry +28 -0
- data/config/example-mysql.yml +40 -0
- data/config/example-sqlite.yml +33 -0
- data/lib/ocp_registry.rb +29 -0
- data/lib/ocp_registry/api_controller.rb +146 -0
- data/lib/ocp_registry/application_manager.rb +213 -0
- data/lib/ocp_registry/cloud_manager/mock.rb +5 -0
- data/lib/ocp_registry/cloud_manager/mock/mock.rb +191 -0
- data/lib/ocp_registry/cloud_manager/mock/model.rb +22 -0
- data/lib/ocp_registry/cloud_manager/openstack.rb +4 -0
- data/lib/ocp_registry/cloud_manager/openstack/cinder_helper.rb +27 -0
- data/lib/ocp_registry/cloud_manager/openstack/keystone_helper.rb +57 -0
- data/lib/ocp_registry/cloud_manager/openstack/nova_helper.rb +37 -0
- data/lib/ocp_registry/cloud_manager/openstack/openstack.rb +126 -0
- data/lib/ocp_registry/common.rb +54 -0
- data/lib/ocp_registry/config.rb +96 -0
- data/lib/ocp_registry/db/001_db_initialize.rb +16 -0
- data/lib/ocp_registry/error.rb +16 -0
- data/lib/ocp_registry/mail_client.rb +141 -0
- data/lib/ocp_registry/models.rb +7 -0
- data/lib/ocp_registry/models/registry_application.rb +10 -0
- data/lib/ocp_registry/runner.rb +47 -0
- data/lib/ocp_registry/version.rb +3 -0
- data/lib/ocp_registry/yaml_helper.rb +23 -0
- data/mail_template/approve_admin.erb +14 -0
- data/mail_template/approve_user.erb +22 -0
- data/mail_template/refuse_admin.erb +16 -0
- data/mail_template/refuse_user.erb +17 -0
- data/mail_template/request_admin.erb +15 -0
- data/mail_template/request_user.erb +16 -0
- data/ocp_registry.gemspec +34 -0
- data/public/bootstrap/css/bootstrap-responsive.css +1109 -0
- data/public/bootstrap/css/bootstrap-responsive.min.css +9 -0
- data/public/bootstrap/css/bootstrap.css +6167 -0
- data/public/bootstrap/css/bootstrap.min.css +9 -0
- data/public/bootstrap/img/glyphicons-halflings-white.png +0 -0
- data/public/bootstrap/img/glyphicons-halflings.png +0 -0
- data/public/bootstrap/js/bootstrap.js +2280 -0
- data/public/bootstrap/js/bootstrap.min.js +6 -0
- data/public/common.css +104 -0
- data/public/favicon.ico +0 -0
- data/public/images/loading.gif +0 -0
- data/public/jquery-1.10.2.min.js +6 -0
- data/public/jquery-1.10.2.min.map +1 -0
- data/public/jquery.json-2.4.min.js +23 -0
- data/public/noty/.gitignore +8 -0
- data/public/noty/LICENSE.txt +20 -0
- data/public/noty/README.markdown +22 -0
- data/public/noty/demo/allLayouts.html +91 -0
- data/public/noty/demo/allTypes.html +86 -0
- data/public/noty/demo/api.html +103 -0
- data/public/noty/demo/buttons.css +320 -0
- data/public/noty/demo/consumingAlert.html +78 -0
- data/public/noty/demo/customContainer.html +90 -0
- data/public/noty/demo/index.html +66 -0
- data/public/noty/demo/jquery-1.7.2.min.js +4 -0
- data/public/noty/demo/usingMaxVisible.html +104 -0
- data/public/noty/demo/usingWithButtons.html +104 -0
- data/public/noty/demo/usingWithButtons2.html +98 -0
- data/public/noty/demo/usingWithModal.html +87 -0
- data/public/noty/demo/usingWithOldOptions.html +110 -0
- data/public/noty/js/jquery.noty.js +547 -0
- data/public/noty/js/layouts/bottom.js +34 -0
- data/public/noty/js/layouts/bottomCenter.js +41 -0
- data/public/noty/js/layouts/bottomLeft.js +43 -0
- data/public/noty/js/layouts/bottomRight.js +43 -0
- data/public/noty/js/layouts/center.js +56 -0
- data/public/noty/js/layouts/centerLeft.js +61 -0
- data/public/noty/js/layouts/centerRight.js +61 -0
- data/public/noty/js/layouts/inline.js +31 -0
- data/public/noty/js/layouts/top.js +34 -0
- data/public/noty/js/layouts/topCenter.js +41 -0
- data/public/noty/js/layouts/topLeft.js +43 -0
- data/public/noty/js/layouts/topRight.js +43 -0
- data/public/noty/js/promise.js +432 -0
- data/public/noty/js/themes/default.js +156 -0
- data/views/apply.erb +134 -0
- data/views/base.erb +25 -0
- data/views/list.erb +41 -0
- data/views/review.erb +141 -0
- data/views/show.erb +96 -0
- data/views/view.erb +7 -0
- metadata +294 -0
@@ -0,0 +1,213 @@
|
|
1
|
+
|
2
|
+
module Ocp::Registry
|
3
|
+
|
4
|
+
class ApplicationManager
|
5
|
+
|
6
|
+
def initialize(cloud_manager,mail_manager)
|
7
|
+
@cloud_manager = cloud_manager
|
8
|
+
@mail_manager = mail_manager
|
9
|
+
@logger = Ocp::Registry.logger
|
10
|
+
end
|
11
|
+
|
12
|
+
def list(email=nil)
|
13
|
+
if email
|
14
|
+
results = Ocp::Registry::Models::RegistryApplication.reverse_order(:created_at).where(:email => email)
|
15
|
+
else
|
16
|
+
results = Ocp::Registry::Models::RegistryApplication.reverse_order(:created_at).all
|
17
|
+
end
|
18
|
+
|
19
|
+
results
|
20
|
+
end
|
21
|
+
|
22
|
+
def show(app_id)
|
23
|
+
app_info = get_application(app_id)
|
24
|
+
return {:status => "error", :message => "Application with id - [#{app_id}] is not existed"} if app_info.nil?
|
25
|
+
app_info
|
26
|
+
end
|
27
|
+
|
28
|
+
def default
|
29
|
+
@default ||= {
|
30
|
+
:email => "" ,
|
31
|
+
:project => "" ,
|
32
|
+
:description => "" ,
|
33
|
+
:settings => Yajl::Encoder.encode(@cloud_manager.default_quota)
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def approve(app_id)
|
38
|
+
app_info = get_application(app_id)
|
39
|
+
|
40
|
+
return {:status => "error", :message => "Application with id - [#{app_id}] is not existed"} if app_info.nil?
|
41
|
+
|
42
|
+
return {:status => "error", :message => "Application [#{app_info.project}] - [#{app_id}] has been #{app_info.state}"} unless app_info.state == 'PENDING'
|
43
|
+
|
44
|
+
unless existed_tenant?(app_info.project, :find_local => false) then
|
45
|
+
# create project tenant and user
|
46
|
+
tenant = @cloud_manager.create_tenant(app_info.project, app_info.description)
|
47
|
+
|
48
|
+
@logger.info("Project [#{tenant.name}] - [#{tenant.id}] has been created with detailed json - #{tenant.to_json}")
|
49
|
+
|
50
|
+
username = Ocp::Registry::Common.parse_email(app_info.email)[:name]
|
51
|
+
|
52
|
+
user = @cloud_manager.find_user_by_name(username)
|
53
|
+
|
54
|
+
if user.nil?
|
55
|
+
password = Ocp::Registry::Common.gen_password
|
56
|
+
user = @cloud_manager.create_user(username, tenant.id, password, app_info.email)
|
57
|
+
@logger.info("User [#{user.name}] - [#{user.id}] has been created with detailed json - #{user.to_json}")
|
58
|
+
else
|
59
|
+
password = "<your-password-in-other-project>"
|
60
|
+
@logger.info("Using existed User [#{user.name}] - [#{user.id}] with detailed json - #{user.to_json}")
|
61
|
+
end
|
62
|
+
|
63
|
+
role = @cloud_manager.default_role
|
64
|
+
|
65
|
+
@cloud_manager.tenant_add_user_with_role(tenant, user.id, role.id)
|
66
|
+
|
67
|
+
@logger.info("User [#{user.name}] - [#{user.id}] has been added into project [#{tenant.name}] - [#{tenant.id}] as [#{role.name}] - [#{role.id}]")
|
68
|
+
|
69
|
+
#assign quota to project
|
70
|
+
|
71
|
+
settings = @cloud_manager.set_tenant_quota(tenant.id, Yajl.load(app_info.settings))
|
72
|
+
|
73
|
+
Ocp::Registry::Models::RegistryApplication.where(:id => app_id)
|
74
|
+
.update(:state => 'APPROVED',
|
75
|
+
:updated_at => Time.now.utc.to_s,
|
76
|
+
:settings => Yajl::Encoder.encode(settings) )
|
77
|
+
app_info = get_application(app_id)
|
78
|
+
if @mail_manager
|
79
|
+
admin_msg = {
|
80
|
+
:app_info => app_info ,
|
81
|
+
:application_link => gen_app_uri(app_id, :review => true) ,
|
82
|
+
:applications_link => gen_app_uri
|
83
|
+
}
|
84
|
+
mail = prepare_mail_properties(:approve_admin, @mail_manager.admin_emails, admin_msg)
|
85
|
+
@mail_manager.send_mail(mail)
|
86
|
+
user_msg = {
|
87
|
+
:app_info => app_info ,
|
88
|
+
:application_link => gen_app_uri(app_id) ,
|
89
|
+
:applications_link => gen_app_uri(nil, :email => app_info.email) ,
|
90
|
+
:login => Ocp::Registry.cloud_login_url ,
|
91
|
+
:username => username ,
|
92
|
+
:password => password
|
93
|
+
}
|
94
|
+
mail = prepare_mail_properties(:approve_user, app_info.email, user_msg)
|
95
|
+
@mail_manager.send_mail(mail)
|
96
|
+
end
|
97
|
+
app_info
|
98
|
+
else
|
99
|
+
@logger.info("Project [#{app_info.project}] name has been used during request time")
|
100
|
+
refuse(app_info.id,"Project Name [#{app_info.project}] has been used during request time")
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
def refuse(app_id,comments)
|
106
|
+
app_info = get_application(app_id)
|
107
|
+
return {:status => "error", :message => "Application with id - [#{app_id}] is not existed"} if app_info.nil?
|
108
|
+
return {:status => "error", :message => "Application [#{app_info.project}] - #{app_id} has been #{app_info.state}"} unless app_info.state == 'PENDING'
|
109
|
+
|
110
|
+
comments ||= "no comments"
|
111
|
+
Ocp::Registry::Models::RegistryApplication.where(:id => app_id)
|
112
|
+
.update(:state => 'REFUSED',
|
113
|
+
:updated_at => Time.now.utc.to_s,
|
114
|
+
:comments => comments)
|
115
|
+
app_info = get_application(app_id)
|
116
|
+
|
117
|
+
if @mail_manager
|
118
|
+
admin_msg = {
|
119
|
+
:app_info => app_info ,
|
120
|
+
:application_link => gen_app_uri(app_id, :review => true) ,
|
121
|
+
:applications_link => gen_app_uri
|
122
|
+
}
|
123
|
+
mail = prepare_mail_properties(:refuse_admin, @mail_manager.admin_emails, admin_msg)
|
124
|
+
@mail_manager.send_mail(mail)
|
125
|
+
user_msg = {
|
126
|
+
:app_info => app_info ,
|
127
|
+
:application_link => gen_app_uri(app_id) ,
|
128
|
+
:applications_link => gen_app_uri(nil, :email => app_info.email)
|
129
|
+
}
|
130
|
+
mail = prepare_mail_properties(:refuse_user, app_info.email, user_msg)
|
131
|
+
@mail_manager.send_mail(mail)
|
132
|
+
end
|
133
|
+
app_info
|
134
|
+
end
|
135
|
+
|
136
|
+
def create(app_info)
|
137
|
+
if existed_tenant?(app_info['project'])
|
138
|
+
{:status => "error", :message => "Project name [#{app_info['project']}] has been used"}
|
139
|
+
else
|
140
|
+
result = Ocp::Registry::Models::RegistryApplication.create(app_info)
|
141
|
+
if @mail_manager
|
142
|
+
admin_msg = {
|
143
|
+
:app_info => result ,
|
144
|
+
:application_link => gen_app_uri(result.id, :review => true) ,
|
145
|
+
:applications_link => gen_app_uri
|
146
|
+
}
|
147
|
+
mail = prepare_mail_properties(:request_admin, @mail_manager.admin_emails, admin_msg)
|
148
|
+
@mail_manager.send_mail(mail)
|
149
|
+
user_msg = {
|
150
|
+
:app_info => result ,
|
151
|
+
:application_link => gen_app_uri(result.id) ,
|
152
|
+
:applications_link => gen_app_uri(nil, :email => result.email)
|
153
|
+
}
|
154
|
+
mail = prepare_mail_properties(:request_user, result.email, user_msg)
|
155
|
+
@mail_manager.send_mail(mail)
|
156
|
+
end
|
157
|
+
result
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def existed_tenant?(tenant, find_local = true)
|
162
|
+
if find_local
|
163
|
+
local_existed = Ocp::Registry::Models::RegistryApplication.where(:project => tenant, :state => 'APPROVED')
|
164
|
+
.count == 0? false : true
|
165
|
+
return true if local_existed
|
166
|
+
end
|
167
|
+
remote_existed = @cloud_manager.get_tenant_by_name(tenant)? true : false
|
168
|
+
if remote_existed
|
169
|
+
return true
|
170
|
+
else
|
171
|
+
return false
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
176
|
+
|
177
|
+
def get_application(app_id)
|
178
|
+
Ocp::Registry::Models::RegistryApplication[:id => app_id]
|
179
|
+
end
|
180
|
+
|
181
|
+
def prepare_mail_properties(template, to, msg = {})
|
182
|
+
{
|
183
|
+
:to => to ,
|
184
|
+
:template => template.to_s ,
|
185
|
+
:msg => msg
|
186
|
+
}
|
187
|
+
end
|
188
|
+
|
189
|
+
def gen_app_uri(app_id = nil, querys = nil)
|
190
|
+
host = URI::escape(Ocp::Registry.base_url)
|
191
|
+
port = Ocp::Registry.http_port
|
192
|
+
path = "/v1/applications"
|
193
|
+
if app_id
|
194
|
+
path += URI::escape("/#{app_id}")
|
195
|
+
end
|
196
|
+
query = nil
|
197
|
+
if(querys && querys.is_a?(Hash))
|
198
|
+
querys.each do |key, value|
|
199
|
+
if query.nil?
|
200
|
+
query = "#{key.to_s}=#{value}"
|
201
|
+
else
|
202
|
+
query += "&"
|
203
|
+
query += "#{key.to_s}=#{value}"
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
uri = URI::HTTP.build(:host => host, :port => port, :path => path, :query => query).to_s
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
module Ocp::Registry
|
2
|
+
class CloudManager
|
3
|
+
|
4
|
+
class Mock < CloudManager
|
5
|
+
def initialize(cloud_config)
|
6
|
+
validate_options(cloud_config)
|
7
|
+
|
8
|
+
@logger = Ocp::Registry.logger
|
9
|
+
|
10
|
+
@mock_properties = cloud_config["mock"]
|
11
|
+
|
12
|
+
unless @mock_properties["auth_url"].match(/\/tokens$/)
|
13
|
+
@mock_properties["auth_url"] = @mock_properties["auth_url"] + "/tokens"
|
14
|
+
end
|
15
|
+
|
16
|
+
@mock_options = {
|
17
|
+
:provider => "mock",
|
18
|
+
:mock_auth_url => @mock_properties["auth_url"],
|
19
|
+
:mock_username => @mock_properties["username"],
|
20
|
+
:mock_api_key => @mock_properties["api_key"],
|
21
|
+
:mock_tenant => @mock_properties["tenant"],
|
22
|
+
:mock_endpoint_type => @mock_properties["endpoint_type"]
|
23
|
+
}
|
24
|
+
@default_role_name = cloud_config["default_role"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate_options(cloud_config)
|
28
|
+
unless cloud_config.has_key?("mock") &&
|
29
|
+
cloud_config["mock"].is_a?(Hash) &&
|
30
|
+
cloud_config["mock"]["auth_url"] &&
|
31
|
+
cloud_config["mock"]["username"] &&
|
32
|
+
cloud_config["mock"]["api_key"] &&
|
33
|
+
cloud_config["mock"]["tenant"] &&
|
34
|
+
cloud_config["default_role"]
|
35
|
+
raise ConfigError, "Invalid mock configuration parameters"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def default_compute_quota
|
40
|
+
{
|
41
|
+
"injected_file_content_bytes"=>10240,
|
42
|
+
"metadata_items"=>128,
|
43
|
+
"ram"=>51200,
|
44
|
+
"floating_ips"=>10,
|
45
|
+
"key_pairs"=>100,
|
46
|
+
"id"=>"defaults",
|
47
|
+
"instances"=>10,
|
48
|
+
"security_group_rules"=>20,
|
49
|
+
"injected_files"=>5,
|
50
|
+
"cores"=>20,
|
51
|
+
"fixed_ips"=>-1,
|
52
|
+
"injected_file_path_bytes"=>255,
|
53
|
+
"security_groups"=>10
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def default_volume_quota
|
58
|
+
{
|
59
|
+
"gigabytes"=>1000,
|
60
|
+
"volumes"=>10,
|
61
|
+
"id"=>"defaults",
|
62
|
+
"snapshots"=>10
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
def default_quota
|
67
|
+
return @default_quota if @default_quota
|
68
|
+
compute_quota = default_compute_quota
|
69
|
+
volume_quota = default_volume_quota
|
70
|
+
@default_quota = compute_quota.merge (volume_quota)
|
71
|
+
cloud_error "Default Quota is not found" unless @default_quota
|
72
|
+
@default_quota
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_role_by_name(name)
|
76
|
+
role = {
|
77
|
+
:id => "08bc68483a804ee59f4290256a8003c6",
|
78
|
+
:name => name
|
79
|
+
}
|
80
|
+
Model.new role
|
81
|
+
end
|
82
|
+
|
83
|
+
def default_role
|
84
|
+
return @default_role if @default_role
|
85
|
+
@default_role ||= get_role_by_name(@default_role_name)
|
86
|
+
cloud_error "Default Role [#{cloud_config["default_role"]}] is not found" unless @default_role
|
87
|
+
@logger.info("Default Role #{@default_role.name} - #{@default_role.id}")
|
88
|
+
@default_role
|
89
|
+
end
|
90
|
+
|
91
|
+
def set_tenant_quota(tenant_id, settings={})
|
92
|
+
result = nil
|
93
|
+
compute_quota = set_compute_quota(tenant_id, settings)
|
94
|
+
volume_quota = set_volume_quota(tenant_id, settings)
|
95
|
+
result = compute_quota.merge (volume_quota) if (compute_quota && volume_quota)
|
96
|
+
cloud_error "Quota for #{tenant_id} has not been set" unless result
|
97
|
+
result
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
def cloud_error(message, exception = nil)
|
102
|
+
@logger.error(message) if @logger
|
103
|
+
@logger.error(exception) if @logger && exception
|
104
|
+
raise Ocp::Registry::CloudError, message
|
105
|
+
end
|
106
|
+
|
107
|
+
CINDER_QUOTA_FIELDS = ["volumes", "snapshots", "gigabytes"]
|
108
|
+
|
109
|
+
|
110
|
+
def set_volume_quota(tenant_id, hash)
|
111
|
+
settings = Ocp::Registry::Common.hash_filter(hash, CINDER_QUOTA_FIELDS)
|
112
|
+
{
|
113
|
+
"gigabytes"=>1000,
|
114
|
+
"volumes"=>10,
|
115
|
+
"id"=>"defaults",
|
116
|
+
"snapshots"=>10
|
117
|
+
}.merge settings
|
118
|
+
end
|
119
|
+
|
120
|
+
def create_tenant(name, description, enabled = true)
|
121
|
+
tenant = {
|
122
|
+
:name => "your project name",
|
123
|
+
:description => "your project description",
|
124
|
+
:enabled => true,
|
125
|
+
:id => "1bb0fed1c2df4b5faa19e7700c049e35"
|
126
|
+
}
|
127
|
+
Model.new tenant
|
128
|
+
end
|
129
|
+
|
130
|
+
def create_user(name, tenant_id, password, email = '')
|
131
|
+
user = {
|
132
|
+
:email => email,
|
133
|
+
:enabled => true,
|
134
|
+
:name => name,
|
135
|
+
:tenant_id => tenant_id,
|
136
|
+
:password => password
|
137
|
+
}
|
138
|
+
Model.new user
|
139
|
+
end
|
140
|
+
|
141
|
+
def get_tenant_by_name(name)
|
142
|
+
nil
|
143
|
+
end
|
144
|
+
|
145
|
+
def tenant_add_user_with_role(tenant, user_id, role_id)
|
146
|
+
true
|
147
|
+
end
|
148
|
+
|
149
|
+
def find_user_by_name(name)
|
150
|
+
user = {
|
151
|
+
:email => "#{name}@email.com",
|
152
|
+
:enabled => true,
|
153
|
+
:name => name,
|
154
|
+
:tenant_id => "1bb0fed1c2df4b5faa19e7700c049e35",
|
155
|
+
:password => "passwordxxxxx"
|
156
|
+
}
|
157
|
+
Model.new user
|
158
|
+
end
|
159
|
+
|
160
|
+
NOVA_QUOTA_FIELDS = ["metadata_items",
|
161
|
+
"cores",
|
162
|
+
"instances",
|
163
|
+
"injected_files",
|
164
|
+
"injected_file_content_bytes",
|
165
|
+
"ram",
|
166
|
+
"floating_ips",
|
167
|
+
"fixed_ips",
|
168
|
+
"security_groups",
|
169
|
+
"security_group_rules"]
|
170
|
+
|
171
|
+
def set_compute_quota(tenant_id, hash)
|
172
|
+
settings = Ocp::Registry::Common.hash_filter(hash, NOVA_QUOTA_FIELDS)
|
173
|
+
{
|
174
|
+
"injected_file_content_bytes"=>10240,
|
175
|
+
"metadata_items"=>128, "ram"=>51200,
|
176
|
+
"floating_ips"=>10,
|
177
|
+
"key_pairs"=>100,
|
178
|
+
"id"=>"defaults",
|
179
|
+
"instances"=>10,
|
180
|
+
"security_group_rules"=>20,
|
181
|
+
"injected_files"=>5,
|
182
|
+
"cores"=>20,
|
183
|
+
"fixed_ips"=>-1,
|
184
|
+
"injected_file_path_bytes"=>255,
|
185
|
+
"security_groups"=>10
|
186
|
+
}.merge settings
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Ocp::Registry
|
2
|
+
class CloudManager
|
3
|
+
|
4
|
+
class Mock < CloudManager
|
5
|
+
class Model
|
6
|
+
def initialize(properties)
|
7
|
+
if properties.is_a? (Hash)
|
8
|
+
@properties = properties
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing(method, *args)
|
13
|
+
return @properties[method.to_sym]
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_json
|
17
|
+
Yajl::Encoder.encode(@properties)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Ocp::Registry
|
2
|
+
|
3
|
+
class CloudManager
|
4
|
+
|
5
|
+
class Openstack
|
6
|
+
|
7
|
+
module CinderHelper
|
8
|
+
CINDER_QUOTA_FIELDS = ["volumes", "snapshots", "gigabytes"]
|
9
|
+
|
10
|
+
def default_volume_quota
|
11
|
+
with_openstack { volume.get_quota_defaults(nil).body["quota_set"] }
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_volume_quota(tenant_id, hash)
|
15
|
+
with_openstack do
|
16
|
+
settings = Ocp::Registry::Common.hash_filter(hash, CINDER_QUOTA_FIELDS)
|
17
|
+
volume.update_quota(tenant_id, settings).body["quota_set"]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|