Skip to content

Commit 6b93f82

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Support sql service catalog backend"
2 parents df17f04 + 3f7c06f commit 6b93f82

File tree

2 files changed

+226
-67
lines changed

2 files changed

+226
-67
lines changed

files/keystone_data.sh

Lines changed: 185 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,13 @@
2020
# SERVICE_TOKEN - aka admin_token in keystone.conf
2121
# SERVICE_ENDPOINT - local Keystone admin endpoint
2222
# SERVICE_TENANT_NAME - name of tenant containing service accounts
23+
# SERVICE_HOST - host used for endpoint creation
2324
# ENABLED_SERVICES - stack.sh's list of services to start
2425
# DEVSTACK_DIR - Top-level DevStack directory
26+
# KEYSTONE_CATALOG_BACKEND - used to determine service catalog creation
27+
28+
# Defaults
29+
# --------
2530

2631
ADMIN_PASSWORD=${ADMIN_PASSWORD:-secrete}
2732
SERVICE_PASSWORD=${SERVICE_PASSWORD:-$ADMIN_PASSWORD}
@@ -30,17 +35,22 @@ export SERVICE_ENDPOINT=$SERVICE_ENDPOINT
3035
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-service}
3136

3237
function get_id () {
33-
echo `$@ | awk '/ id / { print $4 }'`
38+
echo `"$@" | awk '/ id / { print $4 }'`
3439
}
3540

41+
3642
# Tenants
43+
# -------
44+
3745
ADMIN_TENANT=$(get_id keystone tenant-create --name=admin)
3846
SERVICE_TENANT=$(get_id keystone tenant-create --name=$SERVICE_TENANT_NAME)
3947
DEMO_TENANT=$(get_id keystone tenant-create --name=demo)
4048
INVIS_TENANT=$(get_id keystone tenant-create --name=invisible_to_admin)
4149

4250

4351
# Users
52+
# -----
53+
4454
ADMIN_USER=$(get_id keystone user-create --name=admin \
4555
--pass="$ADMIN_PASSWORD" \
4656
--email=admin@example.com)
@@ -50,6 +60,8 @@ DEMO_USER=$(get_id keystone user-create --name=demo \
5060

5161

5262
# Roles
63+
# -----
64+
5365
ADMIN_ROLE=$(get_id keystone role-create --name=admin)
5466
KEYSTONEADMIN_ROLE=$(get_id keystone role-create --name=KeystoneAdmin)
5567
KEYSTONESERVICE_ROLE=$(get_id keystone role-create --name=KeystoneServiceAdmin)
@@ -74,60 +86,193 @@ keystone user-role-add --user_id $DEMO_USER --role_id $MEMBER_ROLE --tenant_id $
7486
keystone user-role-add --user_id $DEMO_USER --role_id $MEMBER_ROLE --tenant_id $INVIS_TENANT
7587

7688

77-
# Configure service users/roles
78-
NOVA_USER=$(get_id keystone user-create --name=nova \
79-
--pass="$SERVICE_PASSWORD" \
80-
--tenant_id $SERVICE_TENANT \
81-
--email=nova@example.com)
82-
keystone user-role-add --tenant_id $SERVICE_TENANT \
83-
--user_id $NOVA_USER \
84-
--role_id $ADMIN_ROLE
89+
# Services
90+
# --------
8591

86-
GLANCE_USER=$(get_id keystone user-create --name=glance \
87-
--pass="$SERVICE_PASSWORD" \
88-
--tenant_id $SERVICE_TENANT \
89-
--email=glance@example.com)
90-
keystone user-role-add --tenant_id $SERVICE_TENANT \
91-
--user_id $GLANCE_USER \
92-
--role_id $ADMIN_ROLE
92+
# Keystone
93+
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
94+
KEYSTONE_SERVICE=$(get_id keystone service-create \
95+
--name=keystone \
96+
--type=identity \
97+
--description="Keystone Identity Service")
98+
keystone endpoint-create \
99+
--region RegionOne \
100+
--service_id $KEYSTONE_SERVICE \
101+
--publicurl "http://$SERVICE_HOST:\$(public_port)s/v2.0" \
102+
--adminurl "http://$SERVICE_HOST:\$(admin_port)s/v2.0" \
103+
--internalurl "http://$SERVICE_HOST:\$(admin_port)s/v2.0"
104+
fi
93105

94-
if [[ "$ENABLED_SERVICES" =~ "swift" ]]; then
95-
SWIFT_USER=$(get_id keystone user-create --name=swift \
96-
--pass="$SERVICE_PASSWORD" \
97-
--tenant_id $SERVICE_TENANT \
98-
--email=swift@example.com)
99-
keystone user-role-add --tenant_id $SERVICE_TENANT \
100-
--user_id $SWIFT_USER \
101-
--role_id $ADMIN_ROLE
106+
# Nova
107+
if [[ "$ENABLED_SERVICES" =~ "n-cpu" ]]; then
108+
NOVA_USER=$(get_id keystone user-create \
109+
--name=nova \
110+
--pass="$SERVICE_PASSWORD" \
111+
--tenant_id $SERVICE_TENANT \
112+
--email=nova@example.com)
113+
keystone user-role-add \
114+
--tenant_id $SERVICE_TENANT \
115+
--user_id $NOVA_USER \
116+
--role_id $ADMIN_ROLE
117+
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
118+
NOVA_SERVICE=$(get_id keystone service-create \
119+
--name=nova \
120+
--type=compute \
121+
--description="Nova Compute Service")
122+
keystone endpoint-create \
123+
--region RegionOne \
124+
--service_id $NOVA_SERVICE \
125+
--publicurl "http://$SERVICE_HOST:\$(compute_port)s/v1.1/\$(tenant_id)s" \
126+
--adminurl "http://$SERVICE_HOST:\$(compute_port)s/v1.1/\$(tenant_id)s" \
127+
--internalurl "http://$SERVICE_HOST:\$(compute_port)s/v1.1/\$(tenant_id)s"
128+
fi
102129
# Nova needs ResellerAdmin role to download images when accessing
103130
# swift through the s3 api. The admin role in swift allows a user
104131
# to act as an admin for their tenant, but ResellerAdmin is needed
105132
# for a user to act as any tenant. The name of this role is also
106133
# configurable in swift-proxy.conf
107134
RESELLER_ROLE=$(get_id keystone role-create --name=ResellerAdmin)
108-
keystone user-role-add --tenant_id $SERVICE_TENANT \
109-
--user_id $NOVA_USER \
110-
--role_id $RESELLER_ROLE
135+
keystone user-role-add \
136+
--tenant_id $SERVICE_TENANT \
137+
--user_id $NOVA_USER \
138+
--role_id $RESELLER_ROLE
111139
fi
112140

113-
if [[ "$ENABLED_SERVICES" =~ "quantum" ]]; then
114-
QUANTUM_USER=$(get_id keystone user-create --name=quantum \
115-
--pass="$SERVICE_PASSWORD" \
116-
--tenant_id $SERVICE_TENANT \
117-
--email=quantum@example.com)
118-
keystone user-role-add --tenant_id $SERVICE_TENANT \
119-
--user_id $QUANTUM_USER \
120-
--role_id $ADMIN_ROLE
141+
# Volume
142+
if [[ "$ENABLED_SERVICES" =~ "n-vol" ]]; then
143+
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
144+
VOLUME_SERVICE=$(get_id keystone service-create \
145+
--name=volume \
146+
--type=volume \
147+
--description="Volume Service")
148+
keystone endpoint-create \
149+
--region RegionOne \
150+
--service_id $VOLUME_SERVICE \
151+
--publicurl "http://$SERVICE_HOST:8776/v1/\$(tenant_id)s" \
152+
--adminurl "http://$SERVICE_HOST:8776/v1/\$(tenant_id)s" \
153+
--internalurl "http://$SERVICE_HOST:8776/v1/\$(tenant_id)s"
154+
fi
155+
fi
156+
157+
# Glance
158+
if [[ "$ENABLED_SERVICES" =~ "g-api" ]]; then
159+
GLANCE_USER=$(get_id keystone user-create \
160+
--name=glance \
161+
--pass="$SERVICE_PASSWORD" \
162+
--tenant_id $SERVICE_TENANT \
163+
--email=glance@example.com)
164+
keystone user-role-add \
165+
--tenant_id $SERVICE_TENANT \
166+
--user_id $GLANCE_USER \
167+
--role_id $ADMIN_ROLE
168+
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
169+
GLANCE_SERVICE=$(get_id keystone service-create \
170+
--name=glance \
171+
--type=image \
172+
--description="Glance Image Service")
173+
keystone endpoint-create \
174+
--region RegionOne \
175+
--service_id $GLANCE_SERVICE \
176+
--publicurl "http://$SERVICE_HOST:9292/v1" \
177+
--adminurl "http://$SERVICE_HOST:9292/v1" \
178+
--internalurl "http://$SERVICE_HOST:9292/v1"
179+
fi
180+
fi
181+
182+
# Swift
183+
if [[ "$ENABLED_SERVICES" =~ "swift" ]]; then
184+
SWIFT_USER=$(get_id keystone user-create \
185+
--name=swift \
186+
--pass="$SERVICE_PASSWORD" \
187+
--tenant_id $SERVICE_TENANT \
188+
--email=swift@example.com)
189+
keystone user-role-add \
190+
--tenant_id $SERVICE_TENANT \
191+
--user_id $SWIFT_USER \
192+
--role_id $ADMIN_ROLE
193+
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
194+
SWIFT_SERVICE=$(get_id keystone service-create \
195+
--name=swift \
196+
--type="object-store" \
197+
--description="Swift Service")
198+
keystone endpoint-create \
199+
--region RegionOne \
200+
--service_id $SWIFT_SERVICE \
201+
--publicurl "http://$SERVICE_HOST:8080/v1/AUTH_\$(tenant_id)s" \
202+
--adminurl "http://$SERVICE_HOST:8080/v1" \
203+
--internalurl "http://$SERVICE_HOST:8080/v1/AUTH_\$(tenant_id)s"
204+
fi
205+
fi
206+
207+
if [[ "$ENABLED_SERVICES" =~ "q-svc" ]]; then
208+
QUANTUM_USER=$(get_id keystone user-create \
209+
--name=quantum \
210+
--pass="$SERVICE_PASSWORD" \
211+
--tenant_id $SERVICE_TENANT \
212+
--email=quantum@example.com)
213+
keystone user-role-add \
214+
--tenant_id $SERVICE_TENANT \
215+
--user_id $QUANTUM_USER \
216+
--role_id $ADMIN_ROLE
217+
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
218+
QUANTUM_SERVICE=$(get_id keystone service-create \
219+
--name=quantum \
220+
--type=network \
221+
--description="Quantum Service")
222+
keystone endpoint-create \
223+
--region RegionOne \
224+
--service_id $QUANTUM_SERVICE \
225+
--publicurl "http://$SERVICE_HOST:9696/" \
226+
--adminurl "http://$SERVICE_HOST:9696/" \
227+
--internalurl "http://$SERVICE_HOST:9696/"
228+
fi
229+
fi
230+
231+
# EC2
232+
if [[ "$ENABLED_SERVICES" =~ "n-api" ]]; then
233+
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
234+
EC2_SERVICE=$(get_id keystone service-create \
235+
--name=ec2 \
236+
--type=ec2 \
237+
--description="EC2 Compatibility Layer")
238+
keystone endpoint-create \
239+
--region RegionOne \
240+
--service_id $EC2_SERVICE \
241+
--publicurl "http://$SERVICE_HOST:8773/services/Cloud" \
242+
--adminurl "http://$SERVICE_HOST:8773/services/Admin" \
243+
--internalurl "http://$SERVICE_HOST:8773/services/Cloud"
244+
fi
245+
fi
246+
247+
# S3
248+
if [[ "$ENABLED_SERVICES" =~ "n-obj" || "$ENABLED_SERVICES" =~ "swift" ]]; then
249+
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
250+
S3_SERVICE=$(get_id keystone service-create \
251+
--name=s3 \
252+
--type=s3 \
253+
--description="S3")
254+
keystone endpoint-create \
255+
--region RegionOne \
256+
--service_id $S3_SERVICE \
257+
--publicurl "http://$SERVICE_HOST:$S3_SERVICE_PORT" \
258+
--adminurl "http://$SERVICE_HOST:$S3_SERVICE_PORT" \
259+
--internalurl "http://$SERVICE_HOST:$S3_SERVICE_PORT"
260+
fi
121261
fi
122262

123263
if [[ "$ENABLED_SERVICES" =~ "tempest" ]]; then
124264
# Tempest has some tests that validate various authorization checks
125265
# between two regular users in separate tenants
126-
ALT_DEMO_TENANT=$(get_id keystone tenant-create --name=alt_demo)
127-
ALT_DEMO_USER=$(get_id keystone user-create --name=alt_demo \
128-
--pass="$ADMIN_PASSWORD" \
129-
--email=alt_demo@example.com)
130-
keystone user-role-add --user $ALT_DEMO_USER --role $MEMBER_ROLE --tenant_id $ALT_DEMO_TENANT
266+
ALT_DEMO_TENANT=$(get_id keystone tenant-create \
267+
--name=alt_demo)
268+
ALT_DEMO_USER=$(get_id keystone user-create \
269+
--name=alt_demo \
270+
--pass="$ADMIN_PASSWORD" \
271+
--email=alt_demo@example.com)
272+
keystone user-role-add \
273+
--tenant_id $ALT_DEMO_TENANT \
274+
--user_id $ALT_DEMO_USER \
275+
--role_id $MEMBER_ROLE
131276
fi
132277

133278
if [[ "$ENABLED_SERVICES" =~ "cinder" ]]; then

stack.sh

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1931,7 +1931,7 @@ if is_service_enabled key; then
19311931
19321932
KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-/etc/keystone}
19331933
KEYSTONE_CONF=$KEYSTONE_CONF_DIR/keystone.conf
1934-
KEYSTONE_CATALOG=$KEYSTONE_CONF_DIR/default_catalog.templates
1934+
KEYSTONE_CATALOG_BACKEND=${KEYSTONE_CATALOG_BACKEND:-template}
19351935
19361936
if [[ ! -d $KEYSTONE_CONF_DIR ]]; then
19371937
sudo mkdir -p $KEYSTONE_CONF_DIR
@@ -1942,41 +1942,49 @@ if is_service_enabled key; then
19421942
cp -p $KEYSTONE_DIR/etc/keystone.conf.sample $KEYSTONE_CONF
19431943
cp -p $KEYSTONE_DIR/etc/policy.json $KEYSTONE_CONF_DIR
19441944
fi
1945-
cp -p $FILES/default_catalog.templates $KEYSTONE_CATALOG
19461945
19471946
# Rewrite stock keystone.conf:
19481947
iniset $KEYSTONE_CONF DEFAULT admin_token "$SERVICE_TOKEN"
19491948
iniset $KEYSTONE_CONF sql connection "$BASE_SQL_CONN/keystone?charset=utf8"
19501949
iniset $KEYSTONE_CONF ec2 driver "keystone.contrib.ec2.backends.sql.Ec2"
1951-
# Configure keystone.conf to use templates
1952-
iniset $KEYSTONE_CONF catalog driver "keystone.catalog.backends.templated.TemplatedCatalog"
1953-
iniset $KEYSTONE_CONF catalog template_file "$KEYSTONE_CATALOG"
19541950
sed -e "
19551951
/^pipeline.*ec2_extension crud_/s|ec2_extension crud_extension|ec2_extension s3_extension crud_extension|;
19561952
" -i $KEYSTONE_CONF
19571953
# Append the S3 bits
19581954
iniset $KEYSTONE_CONF filter:s3_extension paste.filter_factory "keystone.contrib.s3:S3Extension.factory"
19591955
1960-
# Add swift endpoints to service catalog if swift is enabled
1961-
if is_service_enabled swift; then
1962-
echo "catalog.RegionOne.object_store.publicURL = http://%SERVICE_HOST%:8080/v1/AUTH_\$(tenant_id)s" >> $KEYSTONE_CATALOG
1963-
echo "catalog.RegionOne.object_store.adminURL = http://%SERVICE_HOST%:8080/" >> $KEYSTONE_CATALOG
1964-
echo "catalog.RegionOne.object_store.internalURL = http://%SERVICE_HOST%:8080/v1/AUTH_\$(tenant_id)s" >> $KEYSTONE_CATALOG
1965-
echo "catalog.RegionOne.object_store.name = Swift Service" >> $KEYSTONE_CATALOG
1966-
fi
1956+
if [[ "$KEYSTONE_CATALOG_BACKEND" = "sql" ]]; then
1957+
# Configure keystone.conf to use sql
1958+
iniset $KEYSTONE_CONF catalog driver keystone.catalog.backends.sql.Catalog
1959+
inicomment $KEYSTONE_CONF catalog template_file
1960+
else
1961+
KEYSTONE_CATALOG=$KEYSTONE_CONF_DIR/default_catalog.templates
1962+
cp -p $FILES/default_catalog.templates $KEYSTONE_CATALOG
1963+
# Add swift endpoints to service catalog if swift is enabled
1964+
if is_service_enabled swift; then
1965+
echo "catalog.RegionOne.object_store.publicURL = http://%SERVICE_HOST%:8080/v1/AUTH_\$(tenant_id)s" >> $KEYSTONE_CATALOG
1966+
echo "catalog.RegionOne.object_store.adminURL = http://%SERVICE_HOST%:8080/" >> $KEYSTONE_CATALOG
1967+
echo "catalog.RegionOne.object_store.internalURL = http://%SERVICE_HOST%:8080/v1/AUTH_\$(tenant_id)s" >> $KEYSTONE_CATALOG
1968+
echo "catalog.RegionOne.object_store.name = Swift Service" >> $KEYSTONE_CATALOG
1969+
fi
19671970
1968-
# Add quantum endpoints to service catalog if quantum is enabled
1969-
if is_service_enabled quantum; then
1970-
echo "catalog.RegionOne.network.publicURL = http://%SERVICE_HOST%:9696/" >> $KEYSTONE_CATALOG
1971-
echo "catalog.RegionOne.network.adminURL = http://%SERVICE_HOST%:9696/" >> $KEYSTONE_CATALOG
1972-
echo "catalog.RegionOne.network.internalURL = http://%SERVICE_HOST%:9696/" >> $KEYSTONE_CATALOG
1973-
echo "catalog.RegionOne.network.name = Quantum Service" >> $KEYSTONE_CATALOG
1974-
fi
1971+
# Add quantum endpoints to service catalog if quantum is enabled
1972+
if is_service_enabled quantum; then
1973+
echo "catalog.RegionOne.network.publicURL = http://%SERVICE_HOST%:9696/" >> $KEYSTONE_CATALOG
1974+
echo "catalog.RegionOne.network.adminURL = http://%SERVICE_HOST%:9696/" >> $KEYSTONE_CATALOG
1975+
echo "catalog.RegionOne.network.internalURL = http://%SERVICE_HOST%:9696/" >> $KEYSTONE_CATALOG
1976+
echo "catalog.RegionOne.network.name = Quantum Service" >> $KEYSTONE_CATALOG
1977+
fi
1978+
1979+
sudo sed -e "
1980+
s,%SERVICE_HOST%,$SERVICE_HOST,g;
1981+
s,%S3_SERVICE_PORT%,$S3_SERVICE_PORT,g;
1982+
" -i $KEYSTONE_CATALOG
19751983
1976-
sudo sed -e "
1977-
s,%SERVICE_HOST%,$SERVICE_HOST,g;
1978-
s,%S3_SERVICE_PORT%,$S3_SERVICE_PORT,g;
1979-
" -i $KEYSTONE_CATALOG
1984+
# Configure keystone.conf to use templates
1985+
iniset $KEYSTONE_CONF catalog driver "keystone.catalog.backends.templated.TemplatedCatalog"
1986+
iniset $KEYSTONE_CONF catalog template_file "$KEYSTONE_CATALOG"
1987+
fi
19801988
19811989
# Set up logging
19821990
LOGGING_ROOT="devel"
@@ -1988,25 +1996,31 @@ if is_service_enabled key; then
19881996
iniset $KEYSTONE_CONF_DIR/logging.conf logger_root level "DEBUG"
19891997
iniset $KEYSTONE_CONF_DIR/logging.conf logger_root handlers "devel,production"
19901998
1991-
# initialize keystone database
1999+
# Set up the keystone database
19922000
$KEYSTONE_DIR/bin/keystone-manage db_sync
19932001
19942002
# launch keystone and wait for it to answer before continuing
19952003
screen_it key "cd $KEYSTONE_DIR && $KEYSTONE_DIR/bin/keystone-all --config-file $KEYSTONE_CONF $KEYSTONE_LOG_CONFIG -d --debug"
19962004
echo "Waiting for keystone to start..."
1997-
if ! timeout $SERVICE_TIMEOUT sh -c "while ! http_proxy= wget -O- $KEYSTONE_AUTH_PROTOCOL://$SERVICE_HOST:$KEYSTONE_API_PORT/v2.0/ 2>&1 | grep -q '200 OK'; do sleep 1; done"; then
2005+
if ! timeout $SERVICE_TIMEOUT sh -c "while http_proxy= wget -O- $KEYSTONE_AUTH_PROTOCOL://$SERVICE_HOST:$KEYSTONE_API_PORT/v2.0/ 2>&1 | grep -q 'refused'; do sleep 1; done"; then
19982006
echo "keystone did not start"
19992007
exit 1
20002008
fi
20012009
20022010
# keystone_data.sh creates services, admin and demo users, and roles.
20032011
SERVICE_ENDPOINT=$KEYSTONE_AUTH_PROTOCOL://$KEYSTONE_AUTH_HOST:$KEYSTONE_AUTH_PORT/v2.0
2004-
ADMIN_PASSWORD=$ADMIN_PASSWORD SERVICE_TENANT_NAME=$SERVICE_TENANT_NAME SERVICE_PASSWORD=$SERVICE_PASSWORD SERVICE_TOKEN=$SERVICE_TOKEN SERVICE_ENDPOINT=$SERVICE_ENDPOINT DEVSTACK_DIR=$TOP_DIR ENABLED_SERVICES=$ENABLED_SERVICES \
2012+
2013+
ADMIN_PASSWORD=$ADMIN_PASSWORD SERVICE_TENANT_NAME=$SERVICE_TENANT_NAME SERVICE_PASSWORD=$SERVICE_PASSWORD \
2014+
SERVICE_TOKEN=$SERVICE_TOKEN SERVICE_ENDPOINT=$SERVICE_ENDPOINT SERVICE_HOST=$SERVICE_HOST \
2015+
S3_SERVICE_PORT=$S3_SERVICE_PORT KEYSTONE_CATALOG_BACKEND=$KEYSTONE_CATALOG_BACKEND \
2016+
DEVSTACK_DIR=$TOP_DIR ENABLED_SERVICES=$ENABLED_SERVICES \
20052017
bash $FILES/keystone_data.sh
20062018
20072019
# create an access key and secret key for nova ec2 register image
20082020
if is_service_enabled swift && is_service_enabled nova; then
2009-
CREDS=$(keystone --os_auth_url=$SERVICE_ENDPOINT --os_username=nova --os_password=$SERVICE_PASSWORD --os_tenant_name=$SERVICE_TENANT_NAME ec2-credentials-create)
2021+
NOVA_USER_ID=$(keystone user-list | grep ' nova ' | get_field 1)
2022+
NOVA_TENANT_ID=$(keystone tenant-list | grep " $SERVICE_TENANT_NAME " | get_field 1)
2023+
CREDS=$(keystone ec2-credentials-create --user $NOVA_USER_ID --tenant_id $NOVA_TENANT_ID)
20102024
ACCESS_KEY=$(echo "$CREDS" | awk '/ access / { print $4 }')
20112025
SECRET_KEY=$(echo "$CREDS" | awk '/ secret / { print $4 }')
20122026
add_nova_opt "s3_access_key=$ACCESS_KEY"

0 commit comments

Comments
 (0)