From 4aec8802259766a556590813df3229196cc42cc3 Mon Sep 17 00:00:00 2001 From: Diane Fleming Date: Mon, 5 Aug 2013 16:18:08 -0500 Subject: [PATCH] Final changes to OpenStack Admin User Guide bug: #1208507 Change-Id: I6c35b2a50be25a3aa06e3f951dec8598315503ec author: diane fleming --- .../figures/dashboard_admin_overview.png | Bin 0 -> 49311 bytes .../figures/dashboard_admin_project_tab.png | Bin 0 -> 72705 bytes .../common/section_cli_keystone_apiv3.xml | 36 ++ .../section_cli_keystone_credentials.xml | 119 ++++ .../section_cli_keystone_example_usage.xml | 31 + ...ction_cli_keystone_users_tenants_roles.xml | 455 ++++++++++++++ .../common/section_dashboard_access.xml | 239 ++++++- .../common/section_dashboard_overview.xml | 106 ---- .../section_glance_cli_manage_images.xml | 98 +-- .../common/section_keystone-ssl-config.xml | 137 ++-- .../common/section_nova_boot_from_volume.xml | 14 +- .../docbkx/common/section_nova_cli_boot.xml | 25 +- .../docbkx/common/section_nova_cli_images.xml | 10 +- doc/src/docbkx/openstack-admin-user/pom.xml | 9 +- .../src/bk-admin-user-guide.xml | 14 +- .../openstack-admin-user/src/ch_cli.xml | 1 + .../openstack-admin-user/src/ch_dashboard.xml | 16 +- .../openstack-admin-user/src/ch_overview.xml | 11 +- .../src/section_cli_manage_flavors.xml | 113 +++- .../src/section_cli_manage_projects_users.xml | 181 +++++- ...ection_dashboard_manage_projects_users.xml | 299 ++++++++- .../src/section_dashboard_set_quotas.xml | 493 +++++++-------- .../ch_identity_mgmt.xml | 583 +----------------- .../section_keystone_middleware.xml | 87 +++ doc/src/docbkx/openstack-user/pom.xml | 7 +- doc/src/docbkx/openstack-user/src/ch_cli.xml | 11 - .../openstack-user/src/ch_dashboard.xml | 5 +- .../src/section_cli_configure_instances.xml | 113 ++-- 28 files changed, 1987 insertions(+), 1226 deletions(-) create mode 100644 doc/src/docbkx/common/figures/dashboard_admin_overview.png create mode 100644 doc/src/docbkx/common/figures/dashboard_admin_project_tab.png create mode 100644 doc/src/docbkx/common/section_cli_keystone_apiv3.xml create mode 100644 doc/src/docbkx/common/section_cli_keystone_credentials.xml create mode 100644 doc/src/docbkx/common/section_cli_keystone_example_usage.xml create mode 100644 doc/src/docbkx/common/section_cli_keystone_users_tenants_roles.xml delete mode 100644 doc/src/docbkx/common/section_dashboard_overview.xml create mode 100644 doc/src/docbkx/openstack-compute-admin/section_keystone_middleware.xml diff --git a/doc/src/docbkx/common/figures/dashboard_admin_overview.png b/doc/src/docbkx/common/figures/dashboard_admin_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..889750ecaa2ebe8f0e67ac990047a08f8cdc6ad6 GIT binary patch literal 49311 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 H{lNbN`E;FY literal 0 HcmV?d00001 diff --git a/doc/src/docbkx/common/figures/dashboard_admin_project_tab.png b/doc/src/docbkx/common/figures/dashboard_admin_project_tab.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9d24183ff1128bc995cf5412c71e2a0fa0266e GIT binary patch literal 72705 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
  • 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 KcHY2K +
    + Use Identity Service API v3 instead of API v2.0 + Use the following parameters in combination on any + keystone command to specify which version of the API to + use: + + + --os-endpoint. The + endpoint to use instead of the one in the service + catalog. Defaults to + env[OS_SERVICE_ENDPOINT]. + The keystone client detects + the version of the API from this parameter. + + + --os-auth_url. The + Identity Service endpoint to use for + authentication. Defaults to + env[OS_AUTH_URL]. + + + --os-identity-api-version. + The Identity Service API version. Defaults to + env[OS_IDENTITY_API_VERSION] or + 2.0. + + + For example, use the following parameters to use API + v3: + --os-auth_url "http://15.253.57.115:35357/v3" --os-identity-api-version 3 + Use the following parameters to use API v2.0: + --os-auth_url "http://15.253.57.115:35357/v2.0" --os-identity-api-version 2.0 +
    diff --git a/doc/src/docbkx/common/section_cli_keystone_credentials.xml b/doc/src/docbkx/common/section_cli_keystone_credentials.xml new file mode 100644 index 0000000000..08ceeaa9b0 --- /dev/null +++ b/doc/src/docbkx/common/section_cli_keystone_credentials.xml @@ -0,0 +1,119 @@ + +
    + Set up credentials for the keystone client + You can configure the + python-keystoneclient with admin + credentials with either an authentication token or a user name + and password. + + To configure the keystone client with an authentication + token + + Export your keystone endpoint to the + OS_SERVICE_ENDPOINT environment + variable: + $ export OS_SERVICE_ENDPOINT="<keystoneEndpoint>" + + + Export the administrator service token to the + OS_SERVICE_TOKEN environment + variable: + $ export OS_SERVICE_TOKEN="<serviceToken>" + + Alternatively, you can specify these parameters + on any keystone client command: + + + + --os-endpoint + SERVICE_ENDPOINT. + An endpoint to use instead of the one in + the service catalog. Defaults to + env[OS_SERVICE_ENDPOINT]. + + + + + --os-token + SERVICE_TOKEN. + An existing token to use instead of the + one generated by authentication. Defaults + to + env[OS_SERVICE_TOKEN]. + + + + + + + To configure the keystone client with a user name and + password + + Export the administrator user name to the + OS_USERNAME environment + variable: + $ export OS_USERNAME="<adminUserName>" + + + Export the administrator password to the + OS_PASSWORD environment + variable: + $ export OS_PASSWORD="<adminPassword>" + + + Export the tenant name to the + OS_TENANT_NAME environment + variable: + $ export OS_TENANT_NAME="<tenantName>" + + + Export the URL of the keystone auth server, for + example http://localhost:5000/v2.0', to the + OS_AUTH_URL environment + variable: + $ export OS_AUTH_URL="<authServerURL>" + + Alternatively, you can specify these parameters + on any keystone client command: + + + + --os-username + OS_USERNAME. + Name used for authentication with the + Identity Service. Defaults to + env[OS_USERNAME]. + + + + --os-password + OS_PASSWORD. + Password used for authentication with the + Identity Service. Defaults to + env[OS_PASSWORD]. + + + + --os-tenant_name + OS_TENANT_NAME. + Tenant for which to request + authentication. Defaults to + env[OS_TENANT_NAME]. + + + + --os-auth_url + OS_AUTH_URL. + The Identity Service endpoint to use for + authentication. Defaults to + env[OS_AUTH_URL]. + + + + + +
    diff --git a/doc/src/docbkx/common/section_cli_keystone_example_usage.xml b/doc/src/docbkx/common/section_cli_keystone_example_usage.xml new file mode 100644 index 0000000000..a88ec4095c --- /dev/null +++ b/doc/src/docbkx/common/section_cli_keystone_example_usage.xml @@ -0,0 +1,31 @@ + +
    + keystone command-line client example usage + The keystone command-line client uses the following + syntax: + $ keystone PARAMETER COMMAND ARGUMENT + For example, you can run the + user-list and + tenant-create commands, as + follows: +# Using OS_SERVICE_ENDPOINT and OS_SERVICE_TOKEN environment variables +$ export OS_SERVICE_ENDPOINT=http://127.0.0.1:5000/v2.0/ +$ export OS_SERVICE_TOKEN=secrete_token +$ keystone user-list +$ keystone tenant-create --name demo +# Using --os-token and os-endpoint parameters +$ keystone --os-token token --os-endpoint endpoint user-list +$ keystone --os-token token --os-endpoint endpoint tenant-create --name demo +# Using OS_USERNAME, OS_PASSWORD, and OS_TENANT_NAME environment variables +$ export OS_USERNAME=admin +$ export OS_PASSWORD=secrete +$ export OS_TENANT_NAME=admin +$ keystone user-list +$ keystone tenant-create --name demo +# Using tenant_id parameter +$ keystone user-list --tenant_id id +# Using --name, --description, and --enabled parameters +$ keystone tenant-create --name demo --description "demo tenant" --enabled true +
    diff --git a/doc/src/docbkx/common/section_cli_keystone_users_tenants_roles.xml b/doc/src/docbkx/common/section_cli_keystone_users_tenants_roles.xml new file mode 100644 index 0000000000..27a78ff819 --- /dev/null +++ b/doc/src/docbkx/common/section_cli_keystone_users_tenants_roles.xml @@ -0,0 +1,455 @@ + +
    + + Administer users, tenants, roles, and services + You must configure the keystone client with admin + credentials before you can create and manage users, tenants, + and roles. For information about configuration, see the OpenStack Compute Administration + Guide. + You must create at least one tenant, user, and role. You + link the user to the tenant, and the role to the user-tenant + pairing. + To authenticate users against the Identity Service, you must + create service users for each of the OpenStack services, such + as Compute, Image Service, Networking, and so on. + The auth_token middleware supports the + use of either a shared secret or users for each service. +
    + Tenants + A tenant is a group of zero or more users. In Compute, a + tenant owns virtual machines. In the Object Storage + Service, a tenant owns containers. You can associated + users with more than one tenant. You can associate each + tenant and user pairing with a role. + + To list tenants + + List all tenants: + $ keystone tenant-list + +----------------------------------+--------------------+---------+ +| id | name | enabled | ++----------------------------------+--------------------+---------+ +| 66265572db174a7aa66eba661f58eb9e | admin | True | +| ba7c172fe7d74a8a888939f1b8cc7f98 | alt_demo | True | +| b70d90d65e464582b6b2161cf3603ced | demo | True | +| 0675bbff347e4fc5aea94b6adad6000f | demodiane | True | +| c60467a6a1e140a08ba401b09a4f9adb | invisible_to_admin | True | +| a1d0e04f92f948ad9afe91ab8ebedfeb | service | True | ++----------------------------------+--------------------+---------+ + + + + To create a tenant + + Create an enabled tenant named demo: + $ keystone tenant-create --name demo1 --description "demo1 tenant" --enabled true + +-------------+----------------------------------+ +| Property | Value | ++-------------+----------------------------------+ +| description | demo1 tenant | +| enabled | True | +| id | c165a03f78164d7294a3133b345ee9fa | +| name | demo1 | ++-------------+----------------------------------+ + + + + To disable a tenant + + To disable a tenant, specify the tenant + ID: + $ keystone tenant-update c165a03f78164d7294a3133b345ee9fa --enabled false + + + + To get tenant details + + To get tenant details, specify the tenant + ID: + $ keystone tenant-get c165a03f78164d7294a3133b345ee9fa + +-------------+----------------------------------+ +| Property | Value | ++-------------+----------------------------------+ +| description | demo1 tenant | +| enabled | False | +| id | c165a03f78164d7294a3133b345ee9fa | +| name | demo1 | ++-------------+----------------------------------+ + + + + To enable a tenant + + To enable a tenant, specify the tenant + ID: + $ keystone tenant-update c165a03f78164d7294a3133b345ee9fa --enabled true + + + + + To delete a tenant + + To delete a tenant, specify the tenant + ID: + $ keystone tenant-delete f2b7b39c860840dfa47d9ee4adffa0b3 + + +
    +
    + Users + + To list users + + To list all users for all tenants, run the following command: + $ keystone user-list + +----------------------------------+----------+---------+----------------------+ +| id | name | enabled | email | ++----------------------------------+----------+---------+----------------------+ +| 376744b5910b4b4da7d8e6cb483b06a8 | admin | True | admin@example.com | +| a7e160432ddf4a5c800fbab4ca8313a1 | admin1 | True | admin1@example.com | +| 6705b966b1dd450a91971b5c3bfe93ad | alt_demo | True | alt_demo@example.com | +| e900100b4cd54d53bcecac6c4736c4f3 | cinder | True | cinder@example.com | +| 867e53193998439992896bc88d9525f0 | demo | True | demo@example.com | +| 4105efb002cd4464b61580cbd68e5a3c | glance | True | glance@example.com | +| d4844c6e77924194b44a6151b4357ebd | nova | True | nova@example.com | ++----------------------------------+----------+---------+----------------------+ + To list users for a specified tenant, include + the --tenant-id parameter, as follows: +$ keystone user-list --tenant-id 66265572db174a7aa66eba661f58eb9e + +----------------------------------+-------+---------+-------------------+ +| id | name | enabled | email | ++----------------------------------+-------+---------+-------------------+ +| 376744b5910b4b4da7d8e6cb483b06a8 | admin | True | admin@example.com | ++----------------------------------+-------+---------+-------------------+ + + + To create a user + + To create a user named admin + with a specified password and email, run the + following command:$ keystone user-create --name admin --pass secrete --email admin@example.com + By default, the user is enabled and associated + with the default tenant. + The output does not display the password: + +----------+----------------------------------+ +| Property | Value | ++----------+----------------------------------+ +| email | admin@example.com | +| enabled | True | +| id | a7e160432ddf4a5c800fbab4ca8313a1 | +| name | admin | +| tenantId | | ++----------+----------------------------------+ + + + + To update the email address for a user + +Update the email address for a user, as follows: + $ keystone user-update --email joe_admin@example.com admin + User has been updated. + + To confirm your changes, get details for the admin user: + $ keystone user-get admin + +----------+----------------------------------+ +| Property | Value | ++----------+----------------------------------+ +| email | joe_admin@example.com | +| enabled | True | +| id | 376744b5910b4b4da7d8e6cb483b06a8 | +| name | admin | +| tenantId | | ++----------+----------------------------------+ + + + To update a user to disable the user + + Update the user and include the --enabled parameter: + $ keystone user-update --enabled false admin + User has been updated. + + To confirm your changes, get details for the admin user: + $ keystone user-get admin + User is disabled: 376744b5910b4b4da7d8e6cb483b06a8 (HTTP 401) + + + + To update a user to enable the user + + Update the user and include the --enabled parameter: + $ keystone user-update --enabled true admin + User has been updated. + + To confirm your changes, get details for the admin user: + $ keystone user-get admin + User is disabled: 376744b5910b4b4da7d8e6cb483b06a8 (HTTP 401) + + + + To update the password for a user + + arguments + + + user_id + + + password + + + example: + $ keystone user-update --password 03c84b51574841ba9a0d8db7882ac645 foo + + + + To delete a user + + keyword arguments: + + + user + + + example: + $ keystone user-delete f2b7b39c860840dfa47d9ee4adffa0b3 + + +
    +
    + Roles + + To create a role + + arguments + + + name + + + example: + $ keystone role-create --name demo + + + + To delete a role + + arguments + + + role_id + + + example: + $ keystone role-delete 19d1d3344873464d819c45f521ff9890 + + + + To list roles + + example: + $ keystone role-list + + + + To get details for a role + + arguments + + + role_id + + + example: + $ keystone role-get role=19d1d3344873464d819c45f521ff9890 + + + + To add a role to a user + + arguments + + + role_id + + + user_id + + + tenant_id + + + example: + $ keystone add-user-role \ +3a751f78ef4c412b827540b829e2d7dd \ +03c84b51574841ba9a0d8db7882ac645 \ +20601a7f1d94447daa4dff438cb1c209 + + + + To remove a role from a user + + arguments + + + role_id + + + user_id + + + tenant_id + + + example: + $ keystone remove-user-role \ +19d1d3344873464d819c45f521ff9890 \ +08741d8ed88242ca88d1f61484a0fe3b \ +20601a7f1d94447daa4dff438cb1c209 + + +
    +
    + Services + + To create a service + + keyword arguments + + + name + + + type + + + description + + + example: + $ keystone service create \ +--name nova \ +--type=compute \ +--description="Nova Compute Service" + + + + To list services + + arguments + + + service_id + + + example: + $ keystone service-list + + + + To get service details + + arguments + + + service_id + + + example: + $ keystone service-get 08741d8ed88242ca88d1f61484a0fe3b + + + + To delete a service + + arguments + + + service_id + + + example: + $ keystone service-delete 08741d8ed88242ca88d1f61484a0fe3b + + + + To create service users + To configure the OpenStack services with service users, we + must create a tenant for all the services, and + then users for each of the services. We then + assign those service users an Admin role on the + service tenant. This allows them to validate + tokens - and authenticate and authorize other user + requests. + Create a tenant for the services, typically named + 'service' (however, the name can be whatever you choose): + keystone tenant-create --name=service + This returns a UUID of the tenant - keep that, you'll + need it when creating the users and specifying the roles. + Create service users for nova, glance, swift, and + neutron (or whatever subset is relevant to your deployment): + keystone user-create --name=nova \ + --pass=Sekr3tPass \ + --tenant_id=[the uuid of the tenant] \ + --email=nova@nothing.com + Repeat this for each service you want to enable. Email + is a required field in keystone right now, but not used in + relation to the service accounts. Each of these commands + will also return a UUID of the user. Keep those to assign + the Admin role. + For adding the Admin role to the service accounts, + you'll must know the UUID of the role you want to + add. If you don't have them handy, you can look it + up quickly with: + keystone role-list + Once you have it, assign the service users to the Admin + role. This is all assuming that you've already created the + basic roles and settings as described in the configuration + section: + $ keystone user-role-add --tenant_id=[uuid of the service tenant] \ + --user=[uuid of the service account] \ + --role=[uuid of the Admin role] + + + To define services + Keystone also acts as a service catalog to let other + OpenStack systems know where relevant API endpoints exist for + OpenStack Services. The OpenStack Dashboard, in particular, + uses this heavily - and this must be configured for the OpenStack dashboard + to properly function. + The endpoints for these services are defined in a + template, an example of which is in the project as the file + etc/default_catalog.templates. When + keystone uses a template file backend, then changes made to + the endpoints are kept in memory and don't persist if you + restart the service or reboot the machine. Use the SQL + backend when deploying a system for production. + Keystone supports two means of defining the services, + one is the catalog template, as described above - in which + case everything is detailed in that template. + The other is a SQL backend for the catalog service, in + which case after keystone is online, you must add the + services to the catalog: + $ keystone service-create --name=nova \ + --type=compute \ + --description="Nova Compute Service" + keystone service-create --name=ec2 \ + --type=ec2 \ + --description="EC2 Compatibility Layer" + keystone service-create --name=glance \ + --type=image \ + --description="Glance Image Service" + keystone service-create --name=keystone \ + --type=identity \ + --description="Keystone Identity Service" + keystone service-create --name=swift \ + --type=object-store \ + --description="Swift Service" + +
    +
    diff --git a/doc/src/docbkx/common/section_dashboard_access.xml b/doc/src/docbkx/common/section_dashboard_access.xml index 7008881f5b..2d79a74316 100644 --- a/doc/src/docbkx/common/section_dashboard_access.xml +++ b/doc/src/docbkx/common/section_dashboard_access.xml @@ -13,18 +13,31 @@ Overview - + + The following requirements must be fulfilled to access the + OpenStack dashboard: + + + The cloud operator has set up an OpenStack + cloud. + + + You have a recent Web browser that supports HTML5. + It must have cookies and JavaScript enabled. To use + the VNC client for the dashboard, which is based on + noVNC, your browser must support HTML5 Canvas and + HTML5 WebSockets. For more details and a list of + browsers that support noVNC, see https://github.com/kanaka/noVNC/blob/master/README.md, + and https://github.com/kanaka/noVNC/wiki/Browser-support, + respectively. + + Learn how to log in to the dashboard and get a short overview of the interface. -
    Log in to the dashboard @@ -49,13 +62,13 @@ Open a Web browser that supports HTML5. Make - sure that JavaScript and cookies are enabled. - + sure that JavaScript and cookies are + enabled. As a URL, enter the host name or IP address that you got from the cloud operator. - https://IP_ADDRESS_OR_HOSTNAME/ + https://IP_ADDRESS_OR_HOSTNAME/ Certificate Warning You might get a certificate warning when you @@ -76,6 +89,204 @@ In. + After you log in, the following page appears: +
    + OpenStack dashboard – Overview + + + + + +
    +
    + OpenStack dashboard – Overview + + + + + +
    + The top-level row shows the user name that you logged in + with. You can also access Settings or + Sign Out of the Web + interface. + + The visible tabs and functions in the dashboard + depend on the access permissions of the user that is + logged in. They are defined by roles. + + If you are logged in as an end user rather + than an admin user, the main screen shows only the + Project tab. + If you are logged in as an administrator, + the main screen shows the Project and + Admin tabs. +
    +
    + OpenStack dashboard – Project tab + This tab shows details for the projects, or projects, of + which you are a member.
    + OpenStack dashboard – Project tab + + + + + +
    +
    + OpenStack dashboard – Project tab + + + + + +
    + Select a project from the drop-down list on the + left-hand side to access the following categories: + + + Overview + + Shows basic reports on the project. + + + + Instances + + Lists instances and volumes created by users + of the project. + From here, you can stop, pause, or reboot + any instances or connect to them through + virtual network computing (VNC). + + + + Volumes + + Lists volumes created by users of the + project. + From here, you can create or delete + volumes. + + + + Images & + Snapshots + + Lists images and snapshots created by users + of the project, plus any images that are + publicly available. Includes volume snapshots. + From here, you can create and delete images + and snapshots, and launch instances from + images and snapshots. + + + + Access & + Security + + On the Security Groups + tab, you can list, create, and delete security + groups and edit rules for security + groups. + On the Keypairs tab, + you can list, create, and import keypairs, and + delete keypairs. + On the Floating IPs + tab, you can allocate an IP address to or + release it from a project. + On the API Access tab, + you can list the API endpoints. + + + +
    +
    + OpenStack dashboard – Admin tab + This tab shows details for the projects, or projects, of + which you are a member. +
    + OpenStack dashboard – Admin tab + + + + + +
    + On the Admin tab, you can access + the following categories: + + + Overview + + Shows basic reports. + + + + Instances + + Lists all currently running instances + belonging to various users and projects. Not + all projects are visible to the administrator, + though. + + + + Services + + Lists the defined services. + + + + Flavors + + Lists the available sizes of + the VMs that users can launch. + + + + Images + + Shows the custom images that have been + uploaded. Lets you edit image properties or + delete images, if needed. + + + + Project + + Lists the available projects. Lets you + create projects and assign users to the + projects. + + + + Users + + Gives an overview of all users. + + + + Quotas + + Lists the default quota values, which are + hard-coded in OpenStack Nova. Includes + parameters such as the number of CPUs, RAM, or + instances. + + +
    - diff --git a/doc/src/docbkx/common/section_dashboard_overview.xml b/doc/src/docbkx/common/section_dashboard_overview.xml deleted file mode 100644 index b5797cb3c9..0000000000 --- a/doc/src/docbkx/common/section_dashboard_overview.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - -]> -
    - Dashboard overview - After you log in, the following page appears: -
    - OpenStack dashboard – - Overview - - - - - -
    -
    - The top-level row shows the user name that you - logged in with. You can also access - Settings or Sign - Out of the Web interface. - - The visible tabs and functions in the dashboard - depend on the access permissions of the user that - is logged in. They are defined by roles. - - If you are logged in as an end user rather than an - admin user, the main screen shows only the - Project tab. - This tab shows details for the projects, or tenants, - of which you are a member. - Select a project from the drop-down list on the - left-hand side to access the following - categories: - - - Overview - - Shows basic reports on the project. - - - - - Instances - - Lists instances and volumes created by - users of the project. - From here, you can stop, pause, or - reboot any instances or connect to them - through virtual network computing (VNC). - - - - - Volumes - - Lists volumes created by users of the - project. - From here, you can create or delete - volumes. - - - - Images & - Snapshots - - Lists images and snapshots created by - users of the project, plus any images that - are publicly available. Includes volume - snapshots. From here, you can create and - delete images and snapshots, and launch - instances from images and snapshots. - - - - - Access & - Security - - On the Security - Groups tab, you can list, - create, and delete security groups and - edit rules for security groups. - On the Keypairs - tab, you can list, create, and import - keypairs, and delete keypairs. - On the Floating IPs - tab, you can allocate an IP address to or - release it from a project. - On the API Access - tab, you can list the API - endpoints. - - - - -
    diff --git a/doc/src/docbkx/common/section_glance_cli_manage_images.xml b/doc/src/docbkx/common/section_glance_cli_manage_images.xml index 97b941af4f..4037c28a18 100644 --- a/doc/src/docbkx/common/section_glance_cli_manage_images.xml +++ b/doc/src/docbkx/common/section_glance_cli_manage_images.xml @@ -4,12 +4,14 @@ xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="cli_manage_images"> Manage images + During set up of OpenStack cloud, the cloud operator sets user permissions to manage images. Image upload and management might be restricted to only cloud administrators or cloud operators. After you upload an image, it is considered golden and you cannot change it. + role="italic">golden and you cannot change + it. You can upload images through the glance client or the Image Service API. You can also use the nova client to list images, set and delete image metadata, delete images, and take a @@ -22,7 +24,7 @@
    Manage images with the glance client - To list images + To list or get details for images To list the available images: $ glance image-list @@ -41,8 +43,7 @@ | 3cf852bd-2332-48f4-9ae4-7d926d50945e | cirros-0.3.1-x86_64-uec-ramdisk | ari | ari | 3714968 | active | - To show details for a specified image by name or - ID: + To get image details, by name or ID: $ glance image-show myCirrosImage +---------------------------------------+--------------------------------------+ | Property | Value | @@ -83,75 +84,77 @@ | updated_at | 2013-07-22T19:46:42 | +---------------------------------------+--------------------------------------+ + + + To add an image - To add an image - The following example uploads a CentOS 6.3 image in qcow2 format and configures it for public access: $ glance image-create --name centos63-image --disk-format=qcow2 --container-format=bare --is-public=True ./centos63.qcow2 + + + To update an image - To update an image - To update an image by name or ID: - $ glance image-update IMAGE + $ glance image-update IMAGE To modify image properties, use the following optional arguments: - --name NAME. The - name of the image. - + --name + NAME. + The name of the image. --disk-format - DISK_FORMAT. The disk - format of the image. Acceptable formats - are ami, ari, aki, vhd, vmdk, raw, qcow2, - vdi, and iso. - + DISK_FORMAT. + The disk format of the image. Acceptable + formats are ami, ari, aki, vhd, vmdk, raw, + qcow2, vdi, and iso. --container-format - CONTAINER_FORMAT. The - container format of the image. Acceptable - formats are ami, ari, aki, bare, and ovf. - + CONTAINER_FORMAT. + The container format of the image. + Acceptable formats are ami, ari, aki, + bare, and ovf. --owner - TENANT_ID. The tenant who - should own the image. + TENANT_ID. + The tenant who should own the + image. - --size SIZE. The - size of image data, in bytes. + --size + SIZE. + The size of image data, in bytes. --min-disk - DISK_GB. The minimum size - of disk needed to boot image, in - gigabytes. + DISK_GB. + The minimum size of disk needed to boot + image, in gigabytes. --min-ram - DISK_RAM. The minimum - amount of ram needed to boot image, in - megabytes. - + DISK_RAM. + The minimum amount of ram needed to boot + image, in megabytes. --location - IMAGE_URL. The URL where - the data for this image resides. For - example, if the image data is stored in - swift, you could specify + IMAGE_URL. + The URL where the data for this image + resides. For example, if the image data is + stored in swift, you could specify swift://account:key@example.com/container/obj. - - --file FILE. + --file + FILE. Local file that contains disk image to be uploaded during update. Alternatively, you can pass images to the client through @@ -159,19 +162,19 @@ --checksum - CHECKSUM. Hash of image - data to use for verification. - + CHECKSUM. + Hash of image data to use for + verification. --copy-from - IMAGE_URL. Similar to + IMAGE_URL. + Similar to --location in usage, but indicates that the Glance server should immediately copy the data and store it in its configured image store. - --is-public @@ -183,14 +186,12 @@ --is-protected [True|False]. Prevents an image from being deleted. - --property - KEY=VALUE. Arbitrary - property to associate with image. Can be - used multiple times. - + KEY=VALUE. + Arbitrary property to associate with + image. Can be used multiple times. --purge-props. @@ -198,7 +199,6 @@ explicitly set in the update request. Otherwise, those properties not referenced are preserved. - --human-readable. diff --git a/doc/src/docbkx/common/section_keystone-ssl-config.xml b/doc/src/docbkx/common/section_keystone-ssl-config.xml index e417a50951..ac6d4f15c3 100644 --- a/doc/src/docbkx/common/section_keystone-ssl-config.xml +++ b/doc/src/docbkx/common/section_keystone-ssl-config.xml @@ -5,122 +5,95 @@ xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="keystone-ssl-config"> - SSL and Keystone Configuration - Keystone may be configured to support 2-way SSL - out-of-the-box. The x509 certificates used by Keystone must be - obtained externally and configured for use with Keystone as - described in this section. However, a set of sample - certificates is provided in the examples/pki/certs and - examples/pki/private directories with the Keystone - distribution for testing. Here is the description of each of - them and their purpose: -
    - Types of certificates - + Configure the Identity Service with SSL + You can configure the Identity Service to support 2-way + SSL. + You must obtain the x509 certificates externally and + configure them. + The Identity Service provides a set of sample certificates + in the examples/pki/certs and examples/pki/private + directories: + Certificate types - - cacert.pem + cacert.pem - - Certificate Authority chain to validate against. - + Certificate Authority chain to validate against. - - ssl_cert.pem + ssl_cert.pem - - Public certificate for Keystone server. - + Public certificate for Identity Service + server. - - middleware.pem + middleware.pem - - Public and private certificate for Keystone - middleware/client. - + Public and private certificate for + Identity Service middleware/client. - - cakey.pem + cakey.pem - - Private key for the CA. - + Private key for the CA. - - ssl_key.pem + ssl_key.pem - - Private key for the Keystone server. - + Private key for the Identity Service + server. - - Note that you may choose whatever names you want for these - certificates, or combine the public/private keys in the same - file if you wish. These certificates are just provided as an - example. - -
    -
    - SSL Configuration - - To enable SSL with client authentication, modify the - etc/keystone.conf file accordingly under the [ssl] section. SSL - configuration example using the included sample certificates: - - -[ssl] + You can choose names for + these certificates. You can also combine the public/private keys in the + same file, if you wish. These certificates are provided as + an example. +
    + SSL configuration + To enable SSL with client authentication, modify the + [ssl] section in the + etc/keystone.conf file. The + following SSL configuration example uses the included + sample certificates: + [ssl] enable = True certfile = <path to keystone.pem> keyfile = <path to keystonekey.pem> ca_certs = <path to ca.pem> -cert_required = True - - +cert_required = True + Options + + enable. True enables SSL. + Default is False. + - - enable: True enables SSL. Defaults to - False. + certfile. Path to the Identity + Service public certificate file. + + + keyfile. Path to the + Identity Service private certificate file. If you + include the private key in the certfile, you can + omit the keyfile. + + + ca_certs. Path to the CA trust chain. - - certfile: Path to Keystone public - certificate file. - - - - - keyfile: Path to Keystone private - certificate file. If the private key is included in the - certfile, the keyfile maybe omitted. - - - - - ca_certs: Path to CA trust chain. - - - - - cert_required: Requires client - certificate. Defaults to False. - + cert_required. Requires + client certificate. Default is False.
    diff --git a/doc/src/docbkx/common/section_nova_boot_from_volume.xml b/doc/src/docbkx/common/section_nova_boot_from_volume.xml index 154b0f8c31..67a297ff17 100644 --- a/doc/src/docbkx/common/section_nova_boot_from_volume.xml +++ b/doc/src/docbkx/common/section_nova_boot_from_volume.xml @@ -3,17 +3,17 @@ xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="boot_from_volume"> - Launch an instance from a volume + Launch an instance from a volume After you create a bootable volume, you launch an instance from the volume. - To launch an instance from a volume + To launch an instance from a volume - To create a bootable volume - Enter the following command to create a volume from an - image: + To create a bootable volume + To create a volume from an image, run the following + command: # cinder create --image-id 397e713c-b95b-4186-ad46-6126863ea0a9 --display-name my-bootable-vol 8 @@ -29,7 +29,7 @@ Configuration Reference. - To list volumes + To list volumes Enter the following command: $ nova volume-list +--------------------------------------+-----------+-----------------+------+-------------+-------------+ @@ -41,7 +41,7 @@ volume. - To launch an instance + To launch an instance Enter the nova command with the --block_device_mapping parameter, as diff --git a/doc/src/docbkx/common/section_nova_cli_boot.xml b/doc/src/docbkx/common/section_nova_cli_boot.xml index a27c9516bb..215e3c29b1 100644 --- a/doc/src/docbkx/common/section_nova_cli_boot.xml +++ b/doc/src/docbkx/common/section_nova_cli_boot.xml @@ -3,7 +3,7 @@ xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="cli_launch_instances"> - Launch instances + Launch instances Instances are virtual machines that run inside the cloud. Before you can launch an instance, you must gather @@ -15,7 +15,8 @@ provides a pool of images that are accessible to members of different projects.
    - Gather parameters to launch an instance + Gather parameters to launch an + instance To launch an instance, you must specify the following parameters: @@ -103,16 +104,15 @@ xlink:href="launch_from_image">image or a volume. - To gather the parameters you need to launch an + <title wordsize="20">To gather the parameters to launch an instance - On a shell, source the OpenStack RC file. - See . + On a shell, source the OpenStack RC file. See + . List the available flavors: - $ nova flavor-list + $ nova flavor-list +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+ @@ -187,14 +187,15 @@
    - Launch an instance from an image + Launch an instance from an image Use this procedure to launch an instance from an image. - To launch an instance from an image + To launch an instance from an + image Now you have all parameters required to launch - an instance, run the following command. Specify + an instance, run the following command and specify the server name, flavor ID, and image ID. Optionally, you can provide a key name for access control and security group for security. You can @@ -206,8 +207,8 @@ system and pass it at instance launch by using the flag --user-data <user-data-file>. - $ nova boot --flavor FLAVOR_ID --image IMAGE_ID --key_name KEY_NAME --user-data mydata.file \ - --security_group NAME_OF_SEC_GROUP NAME_FOR_INSTANCE --meta KEY=VALUE --meta KEY=VALUE + $ nova boot --flavor FLAVOR_ID --image IMAGE_ID --key_name KEY_NAME --user-data mydata.file \ + --security_group SEC_GROUP NAME_FOR_INSTANCE --meta KEY=VALUE --meta KEY=VALUE The command returns a list of server properties, depending on which parameters you provide. A status of BUILD indicates diff --git a/doc/src/docbkx/common/section_nova_cli_images.xml b/doc/src/docbkx/common/section_nova_cli_images.xml index d9bda812a5..0936943cf4 100644 --- a/doc/src/docbkx/common/section_nova_cli_images.xml +++ b/doc/src/docbkx/common/section_nova_cli_images.xml @@ -76,15 +76,18 @@ | metadata kernel_id | df430cc2-3406-4061-b635-a51c16e488ac | | metadata instance_type_ephemeral_gb | 0 | +-------------------------------------+--------------------------------------+ - After a while, the image status changes from + The image status changes from SAVING to ACTIVE. Only the tenant who creates the image has access to it. + + + To launch an instance from your image - You can launch an instance from this image. Include - the image ID and flavor ID, as follows: + To launch an instance from your image, include the + image ID and flavor ID, as follows: $ nova boot newServer --image 7e5142af-1253-4634-bcc6-89482c5f2e8a --flavor 3 +-------------------------------------+--------------------------------------+ | Property | Value | @@ -120,7 +123,6 @@ Troubleshoot image creation - You cannot create a snapshot from an instance diff --git a/doc/src/docbkx/openstack-admin-user/pom.xml b/doc/src/docbkx/openstack-admin-user/pom.xml index 317d7975e7..ad2f4923e5 100644 --- a/doc/src/docbkx/openstack-admin-user/pom.xml +++ b/doc/src/docbkx/openstack-admin-user/pom.xml @@ -12,7 +12,6 @@ grizzly 1 - @@ -31,9 +30,7 @@ generate-sources - bk-admin-user-guide.xml - 0 - external + bk-admin-user-guide.xml appendix toc article/appendix nop @@ -47,6 +44,9 @@ qandaset toc reference toc,title set toc,title + adminuser + 0 + external 1 target/docbkx/webhelp/ admin-user-guide @@ -55,6 +55,7 @@ + adminuser false true true diff --git a/doc/src/docbkx/openstack-admin-user/src/bk-admin-user-guide.xml b/doc/src/docbkx/openstack-admin-user/src/bk-admin-user-guide.xml index d4559cfa81..0776e56514 100644 --- a/doc/src/docbkx/openstack-admin-user/src/bk-admin-user-guide.xml +++ b/doc/src/docbkx/openstack-admin-user/src/bk-admin-user-guide.xml @@ -38,18 +38,20 @@ OpenStack is an open source cloud computing platform for public and private clouds. A series of interrelated projects deliver a cloud infrastructure - solution. This guide shows OpenStack admin users how to - create and manage resources in an OpenStack cloud with - the OpenStack dashboard or OpenStack client - commands. + solution. This guide helps cloud administrators + perform daily administrative tasks with the OpenStack + dashboard or OpenStack client commands. Tasks include + management of projects, users, tenants, services, + images, flavors, and quotas. - 2013-07-29 + 2013-08-08 - First edition of this document. + First edition of this + document. diff --git a/doc/src/docbkx/openstack-admin-user/src/ch_cli.xml b/doc/src/docbkx/openstack-admin-user/src/ch_cli.xml index fd6675d653..6b93fca699 100644 --- a/doc/src/docbkx/openstack-admin-user/src/ch_cli.xml +++ b/doc/src/docbkx/openstack-admin-user/src/ch_cli.xml @@ -14,6 +14,7 @@ + diff --git a/doc/src/docbkx/openstack-admin-user/src/ch_dashboard.xml b/doc/src/docbkx/openstack-admin-user/src/ch_dashboard.xml index 5688289500..f8cf1b0593 100644 --- a/doc/src/docbkx/openstack-admin-user/src/ch_dashboard.xml +++ b/doc/src/docbkx/openstack-admin-user/src/ch_dashboard.xml @@ -6,17 +6,13 @@ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:raxm="http://docs.rackspace.com/api/metadata" version="5.0" xml:id="ch_dashboard"> - - OpenStack dashboard - - As a cloud end user, the OpenStack dashboard lets you to - provision your own resources within the limits set by - administrators. You can modify these examples to create other - types and sizes of server instances. + OpenStack dashboard + + As a cloud administrative user, the OpenStack dashboard lets + you create and manage projects and users, images, and flavors, + and set quotas. - - @@ -24,4 +20,4 @@ - + \ No newline at end of file diff --git a/doc/src/docbkx/openstack-admin-user/src/ch_overview.xml b/doc/src/docbkx/openstack-admin-user/src/ch_overview.xml index effbeedb1a..7f3dd01c34 100644 --- a/doc/src/docbkx/openstack-admin-user/src/ch_overview.xml +++ b/doc/src/docbkx/openstack-admin-user/src/ch_overview.xml @@ -7,11 +7,14 @@ xmlns:html="http://www.w3.org/1999/xhtml" xmlns:db="http://docbook.org/ns/docbook" version="5.0" xml:id="openstack_user_guide"> - How can I use an OpenStack cloud? + How can I administer an OpenStack cloud? - As an OpenStack cloud admin user, you can manage projects and users, images, or flavors, and set quotas. The examples in this guide - show you how to complete these tasks by using the OpenStack dashboard and command-line clients. The - dashboard, also known as As an OpenStack cloud administrative user, you can manage + tenants, known as projects, users, + services, images, flavors, and quotas. The examples in this + guide show you how to complete these tasks by using the + OpenStack dashboard and command-line clients. + The dashboard, also known as horizon, is a Web-based graphical interface. The command-line clients let you run simple commands to create and diff --git a/doc/src/docbkx/openstack-admin-user/src/section_cli_manage_flavors.xml b/doc/src/docbkx/openstack-admin-user/src/section_cli_manage_flavors.xml index b332946f09..e9a62dbf25 100644 --- a/doc/src/docbkx/openstack-admin-user/src/section_cli_manage_flavors.xml +++ b/doc/src/docbkx/openstack-admin-user/src/section_cli_manage_flavors.xml @@ -4,5 +4,116 @@ xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="cli_manage_flavors"> Manage flavors - + In OpenStack, flavors define the compute, memory, and + storage capacity of nova computing instances. To put it + simply, a flavor is an available hardware configuration + for a server. It defines the size of a + virtual server that can be launched. + A flavor consists of the following parameters: + Flavor parameters + + Flavor ID + + Automatically generated by OpenStack. + + + + Name + + Name for the new flavor. + + + + VCPUs + + Number of virtual CPUs to use. + + + + Memory MB + + Amount of RAM to use (in megabytes). + + + + Root Disk GB + + Amount of disk space (in gigabytes) to use + for the root (/) partition. + + + + Ephemeral Disk GB + + Amount of disk space (in gigabytes) to use + for the ephemeral partition. If unspecified, + the value is 0 by default. + Ephemeral disks offer machine local disk + storage linked to the lifecycle of a VM + instance. When a VM is terminated, all data on + the ephemeral disk is lost. Ephemeral disks + are not included in any snapshots. + + + + Swap + + Amount of swap space (in megabytes) to use. + If unspecified, the value is 0 by default. + + + + Default Flavors + + + m1.tiny (1 VCPU/0 GB Disk/512 MB RAM) + + + m1.smaller (1 VCPU/0 GB Disk/1024 MB RAM) + + + m1.small (1 VCPU/10 GB Disk/2048 MB RAM) + + + m1.medium (2 VCPU/10 GB Disk/3072 MB RAM) + + + m1.large (4 VCPU/10 GB Disk/8192 MB RAM) + + + m1.xlarge (8 VCPU/10 GB Disk/8192 MB RAM) + + + You can manage flavors with the nova + flavor-* commands provided by the + python-novaclient package. + + To list flavors + + When you list flavors, the list shows the ID and name, + the amount of memory, the amount of disk space + for the root partition and for the ephemeral + partition, the swap, and the number of virtual + CPUs for each flavor. + $ nova flavor-list + + + + To create a flavor + + When you create a flavor, you must specify + the flavor name, ID, RAM size, disk size, and the + number of VCPUs. For optional parameters, see nova + help + flavor-create. + $ nova flavor-create FLAVOR_NAME FLAVOR_ID RAM_IN_MB ROOT_DISK_IN_GB NUMBER_OF_VCPUS + + + + To delete a flavor + + Delete a specified flavor, as follows: + $ nova flavor-delete FLAVOR_ID + +
    diff --git a/doc/src/docbkx/openstack-admin-user/src/section_cli_manage_projects_users.xml b/doc/src/docbkx/openstack-admin-user/src/section_cli_manage_projects_users.xml index 982f958fef..378c6c3120 100644 --- a/doc/src/docbkx/openstack-admin-user/src/section_cli_manage_projects_users.xml +++ b/doc/src/docbkx/openstack-admin-user/src/section_cli_manage_projects_users.xml @@ -2,7 +2,184 @@
    + xml:id="admin_cli_manage_projects_users"> Manage projects and users - + In an OpenStack cloud, you can manage projects and users + independently from each other. + Projects represent different organizational units in the + cloud to which you can assign users. + Cloud admin users perform both project and user management + tasks. + During the basic system set up, the cloud operator must + define at least one project, user, and role. The operator + links the role to the user and the user to the project. Roles + define which actions users can perform. + The python-keystoneclient provides the + keystone command-line client, which you use to manage projects + and users from any machine outside the cloud. Before you can + run commands, you must download and source an OpenStack RC + file. See . + + Administrator credentials + To administer projects and users, you must have + administrator credentials. Make sure to download and + source the OpenStack RC file as administrator before you + run keystone commands. Alternatively, export the + respective environment variables by using the token or + password authentication method. For details, see http://docs.openstack.org/essex/openstack-compute/admin/content/adding-users-tenants-and-roles-with-python-keystoneclient.html. + +
    + Create and manage projects + + To list all projects + + To list all projects with their ID, name, and + whether they are enabled or not, run the following + command: + $ keystone tenant-list + + + + To create a project + + $ keystone tenant-create --name PROJECT_NAME  + Creates a new project with the specified name. + + + + + To temporarily disable a project + + $ keystone tenant-update PROJECT_ID --enabled false + For the details of the impact, see . + + + + + To delete a project + + $ keystone tenant-delete PROJECT_ID  + Deletes the specified project. + + +
    +
    + Create and manage user accounts + + To list all users + + $ keystone user-list + Lists all user accounts with their ID, name, + e-mail address, and the information if they are + enabled or not. + + + + To create a user account + + $ keystone user-create --name USER_NAME --tenant_id PROJECT_ID --pass PRELIM_PASSWD + Creates a new user with the specified name. + While the only required argument is --name, at + least specify the optional parameters --tenant_id + and --pass. Otherwise the newly created user + cannot log in to the SUSE Cloud Dashboard. + + + + To temporarily disable a user account + + $ keystone user-update USER_ID --enabled false + If you disable a user account, the user can no + longer log in, but his data is kept so that the + account can be re-enabled at any time. + + + + To delete a user account + + $ keystone user-delete USER_ID  + Deletes the specified user account. + + +
    +
    + Create and manage roles + Roles define the actions that the user is allowed to + perform. Configure roles in OpenStack Identity (Keystone). + Actions are defined per OpenStack service in the + respective /etc/[SERVICE_CODENAME]/policy.json file, for + example in /etc/nova/policy.json for the Compute (Nova) + service. + + To list all roles + + $ keystone role-list + Lists all roles with their ID and name. + + + + To create a role + + $ keystone role-create --name=ROLE_NAME  + Creates a role with the specified name. + + + + To delete a role + + $ keystone role-delete ROLE_ID  + Deletes the specified role. + + +
    +
    + Modify user assignments for a project + Whereas each user is assigned to a primary project when + his user account is created, users can be members of + multiple projects. The keystone client does not allow to + directly assign users to additional projects. Instead you + need to define a role and grant that role to a + user-project pair. + + To modify user assignments for a project + + On a shell, source the OpenStack RC file. For + details, refer to OpenStack RC File. + + + Check if there is already a member role defined: + $ keystone role-list + + + If not, create it: + $ keystone role-create --name=member + + + To grant the role to a user-project pair (and to + thus assign a user to this project), you need to + know the IDs of the role, the user, and the + project. You can look them up with keystone + role-list, keystone user-list, and keystone + tenant-list. + + + To grant the user membership of a project: + $ keystone user-role-add --role-id=ROLE_ID --tenant_id=TENANT_ID \ + --user_id=USER_ID + + + To assign the user to multiple projects, repeat + the last step. + + + To verify the assignments, use: + $ keystone user-role-list --user_id=USER_ID --tenant_id=TENANT_ID  + + +
    diff --git a/doc/src/docbkx/openstack-admin-user/src/section_dashboard_manage_projects_users.xml b/doc/src/docbkx/openstack-admin-user/src/section_dashboard_manage_projects_users.xml index 6fdcd2957d..96c8a968a1 100644 --- a/doc/src/docbkx/openstack-admin-user/src/section_dashboard_manage_projects_users.xml +++ b/doc/src/docbkx/openstack-admin-user/src/section_dashboard_manage_projects_users.xml @@ -1,10 +1,301 @@
    - Manage projects and users + Projects and users + + In an OpenStack cloud, you can manage projects and users + independently from each other. + Projects represent different organizational units in the + cloud to which you can assign users. + Cloud admin users perform both project and user management + tasks. + During the basic system set up, the cloud operator must + define at least one project, user, and role. The operator + links the role to the user and the user to the project. Roles + define which actions users can perform. + As an admin user, you can create additional projects and + users as needed. + Learn how to add, update, and delete projects and users, + assign users to one or more projects, and change or remove the + assignment. To enable or temporarily disable a project or + user, update that project or user. +
    + Create and manage projects + You can create, temporarily disable, enable, and delete + projects. + + To create a project + + Log in to the OpenStack dashboard. + + + In the CURRENT PROJECT + drop-down list on the Project + tab, select the admin + project. + + + On the Admin tab, click the + Projects category. + + + Click Create + Project. + + + In the Create Project + window, enter a name and description for the + project. By default, the project is enabled. See + . Click + Create Project. + The dashboard assigns an ID and shows the + project in the Projects + category. + + + + To update a project + You can update a project to change its name or + description, and to enable or temporarily disable + it. + Disabling a project has the following consequences: + + Consequences of disabling a project + + In the dashboard, the project can no longer + be accessed from the CURRENT + PROJECT drop-down list on the + Project tab. + + + Users that are only members of the disabled + project can no longer log in. + + + It is impossible to launch new instances for + a disabled project. Instances already running + are not automatically terminated though—you + must stop them manually. + + + All data for a disabled project is kept so + that you can enable the project again at any + time. + + + + Select the project that you want to update. + + + + From the More drop-down + list, click Edit + Project. + + + Optionally, change the following attributes for + the project: + + Name. + + + Description. + + + To disable the project, clear the + Enabled check + box. + To enable the project, select the + Enabled check + box. + + + + + Click Save. + + + + To delete one or more projects + + Select the projects that you want to delete. + + + + Click Delete Projects and + confirm your choice in the pop-up that + appears. + + You cannot undo the delete action. + + + +
    +
    + Create and manage user accounts + Users are members of one or multiple projects. + You can add, update, and delete users. To enable or + temporarily disable a user, update that user. + When you create a user account, you must assign the + account to a primary project. Optionally, you can assign + the account to additional projects. + When you disable a user account, the user can no longer + log in, but the data is kept so that you can enable the + account again at any time. + Before you can delete a user account, you must remove + the user account from its primary project. + + To create a user account + + Log in to the OpenStack dashboard. + + + In the CURRENT PROJECT + drop-down list on the Project + tab, select the admin + project. + + + Click the Users + category. + + + On the Admin tab, select + the Users category. + - + + Click Create User. + + + In the Create User window, + enter a user name, email, and preliminary password + for the user. + Select a project from the Primary + Project drop-down list. + Choose a role for the user from the + Role drop-down list. + Default is Member. + + + Click Create User to + confirm your changes. + The dashboard assigns an ID and shows the user + account in the Users + category. + + + + To temporarily deactivate a user account + + Select the user, and from the Actions drop-down + list, select Disable. + + + + To delete one or more users accounts + + Activate the check boxes in front of the user + accounts that you want to delete. + + + Click Delete Users and confirm your choice in + the pop-up that appears. + A message on the Web page shows if the action + has been successful. + NOTE: Remove User from + Primary Project + If a user account cannot be deleted, it is + because it is still assigned to its primary + project. + + + + To delete a user from a project + + Edit the user data to view which Primary Project + he is assigned to. + + + Remove the user from his primary project as + described in Modifying User Assignments for a + Project, to . + + +
    + Modify user assignments for a project + When creating new users, you must assign them to a + primary project as described in Creating Or Deleting Users Accounts. To + assign users to additional projects or to modify and + remove assignments, proceed as follows: + + To modify user assignments for a + project + + On the Admin tab, select the Projects + category. + + + Select the project for which to modify user + assignments. + + + From the Actions drop-down list for the + project, select Modify Users. + The Dashboard shows two lists of users: + Users For Project shows the users assigned to + the current project, Add New Users shows other + existing users, which can be assigned to the + current project. + + + + + + + + To remove users from the current project, + select one or multiple users and click Remove + User or Remove Users. + + + + To assign a user to the current project + + Select the user and click Add To + Project. + + + In the window that appears, set the user's + role with which to add him to the project and + click Add. Roles define the actions that the + user is allowed to perform. Roles are + configured by the cloud operator in OpenStack + Identity (Keystone). Actions are defined per + OpenStack service in the respective + /etc/[SERVICE_CODENAME]/policy.json file, for + example in /etc/nova/policy.json for the + Compute (Nova) service. For details, see + http://docs.openstack.org/essex/openstack-compute/install/content/keystone-concepts.html. + + + +
    +
    diff --git a/doc/src/docbkx/openstack-admin-user/src/section_dashboard_set_quotas.xml b/doc/src/docbkx/openstack-admin-user/src/section_dashboard_set_quotas.xml index fb213cf13a..2426c2baac 100644 --- a/doc/src/docbkx/openstack-admin-user/src/section_dashboard_set_quotas.xml +++ b/doc/src/docbkx/openstack-admin-user/src/section_dashboard_set_quotas.xml @@ -1,294 +1,217 @@ + ]> -
    - Set quotas - - To prevent system capacities from being exhausted without - notification, you can set up quotas. Quotas are operational limits. - For example, the number of gigabytes allowed per tenant can be - controlled so that cloud resources are optimized. - Quotas are currently enforced at the tenant (or project) level, - rather than by user. - - Typically, default values are changed because a tenant requires - more than 10 volumes, or more than 1TB on a Compute node. - - - - Compute Quota Descriptions (listed in order of appearance) - - - - - - - - Quota - - - Description - - - Service - - - - - - - - Metadata Items - - - - - Number of metadata items allowed per instance. - - - - - Compute - - - - - - - VCPUs - - - - - Number of instance cores allowed per tenant. - - - - - Compute - - - - - - - Instances - - - - - Number of instances allowed per tenant. - - - - - Compute - - - - - - - Injected Files - - - - - Number of injected files allowed per tenant. - - - - - Compute - - - - - - - Injected File Content Bytes - - - - - Number of content bytes allowed per injected file. - - - - - Compute - - - - - - - Volumes - - - - - Number of volumes allowed per tenant. - - - - - Block Storage - - - - - - - Gigabytes - - - - - Number of volume gigabtyes allowed per tenant. - - - - - Block Storage - - - - - - - RAM (MB) - - - - - Megabytes of ram allowed per instance. - - - - - Compute - - - - - - - Floating IPs - - - - - Number of floating IP addresses allowed per tenant. - - - - - Compute - - - - - - - Fixed IPs - - - - - Number of fixed IP addresses allowed per tenant. This number - must be equal to or greater than the number of allowed - instances. - - - - - Compute - - - - - - - Security Groups - - - - - Number of security groups allowed per tenant. - - - - - Compute - - - - - - - Security Group Rules - - - - - Number of rules per security group. - - - - - Compute - - - - - +
    + Set quotas + + To prevent system capacities from being exhausted without + notification, you can set up quotas. Quotas are operational + limits. For example, to optimize cloud resources, you can control + the number of gigabytes allowed for each project, also known as a tenant. Quotas are + currently enforced at the project level rather than + at the user level. + Typically, you change default values because a project requires + more than 10 volumes, or more than 1 TB on a Compute node. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Compute and Block Storage quotas
    QuotaDescriptionService
    + Metadata Items + + Number of metadata items allowed per instance. + + Compute +
    + VCPUs + + Number of instance cores allowed per tenant. + + Compute +
    + Instances + + Number of instances allowed per tenant. + + Compute +
    + Injected Files + + Number of injected files allowed per tenant. + + Compute +
    + Injected File Content Bytes + + Number of content bytes allowed per injected file. + + Compute +
    + Volumes + + Number of volumes allowed per tenant. + + Block Storage +
    + Gigabytes + + Number of volume gigabtyes allowed per tenant. + + Block Storage +
    + RAM (MB) + + Megabytes of ram allowed per instance. + + Compute +
    + Floating IPs + + Number of floating IP addresses allowed per tenant. + + Compute +
    + Fixed IPs + + Number of fixed IP addresses allowed per tenant. + This number must be equal to or greater than the number + of allowed instances. + + Compute +
    + Security Groups + + Number of security groups allowed per tenant. + + Compute +
    + Security Group Rules + + Number of rules per security group. + + Compute +
    -
    +
    - View and update quotas for a tenant (project) - - As an administrative user in the dashboard, you can view but not edit - the default quotas for a new tenant. However, quotas can be updated - for individual tenants after the tenant has been created. - - - To view default quotas: - Click the Admin tab in the navigation sidebar, - then click the System Info category. - - Click the Default Quotas tab in the - main window. - - - To update quotas for an individual tenant (project) in the dashboard: - Click the Admin tab in the navigation - sidebar, then click the Projects category. - - Select the tenant for which to set or change quota - values. - - Click the tenant's More button, - and then select Modify Quotas. The - Edit Project window is displayed. - - Edit quota values on the Quota tab, - and click the Save button. - - - - Not all possible project quotas are displayed in the dashboard. To obtain - and update the complete list for a service, use its command-line tools - (see ). - - -
    -
    + Project quotas + As an administrative user in the dashboard, you can set + quotas when you or update quotas for an + existing project. + + To view default quotas + + On the Admin tab in the navigation + sidebar, click the System Info + category. + + + Click the Default Quotas tab in the + main page. + + + + To update project quotas + + On the Admin tab in the navigation + sidebar, click the Projects category. + + + Select the project for which to change quota values. + + + From the More drop-down list, click + Modify Quotas. + + + On the Quota tab in the + Edit Project window, edit quota + values. Then, click Save. + + + + Not all possible project quotas are displayed in the + dashboard. To obtain and update the complete list for a + service, use the keystone command-line client. See . + +
    +
    \ No newline at end of file diff --git a/doc/src/docbkx/openstack-compute-admin/ch_identity_mgmt.xml b/doc/src/docbkx/openstack-compute-admin/ch_identity_mgmt.xml index a73e235b8d..404aa10f12 100644 --- a/doc/src/docbkx/openstack-compute-admin/ch_identity_mgmt.xml +++ b/doc/src/docbkx/openstack-compute-admin/ch_identity_mgmt.xml @@ -38,10 +38,10 @@
    User CRUD - Keystone provides a user CRUD filter that can be added to - the public_api pipeline. This user crud filter allows users to - use a HTTP PATCH to change their own password. To enable this - extension you should define a + The Identity Service provides a user CRUD filter that can be + added to the public_api pipeline. This user crud filter allows + users to use a HTTP PATCH to change their own password. To + enable this extension you should define a user_crud_extension filter, insert it after the *_body middleware and before the public_service app in the public_api WSGI @@ -98,9 +98,7 @@ paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory - + admin_tenant_name = service Middleware parameters in paste config take priority. You must remove these values in the @@ -138,8 +136,9 @@ pipeline = [...] json_body stats_reporting ec2_extension [...] admin_service
    - Running the Identity Service - To start Identity Service, run the following command: + Run the Identity Service + To start the Identity Service, run the following + command: $ keystone-all This command starts two wsgi.Server instances, configured by the keystone.conf and @@ -150,11 +149,10 @@ pipeline = [...] json_body stats_reporting ec2_extension [...] admin_service
    - Initializing the Identity Service - - keystone-manage is designed to execute + Initialize the Identity Service + keystone-manage enables you to run commands that cannot be administered through the normal REST - api. At the moment, the following calls are supported: + API. The following calls are supported: @@ -172,434 +170,8 @@ pipeline = [...] json_body stats_reporting ec2_extension [...] admin_serviceInvoking keystone-manage by itself will give you additional usage information.
    -
    - - Adding Users, Tenants, and Roles with - python-keystoneclient - Only users with admin credentials can administer users, - tenants and roles. You can configure the python-keystoneclient - with admin credentials through either the authentication token, - or the username and password method. -
    - Token Auth Method - To use keystone client using token auth, set the following - flags: - - - - --endpoint SERVICE_ENDPOINT. The - keystone endpoint to communicate with. The default - endpoint is http://localhost:35357/v2.0'. - - - - --token SERVICE_TOKEN. The - administrator service token. - - -
    -
    - Password Auth Method - - - - --username OS_USERNAME. The - administrator username. - - - - --password OS_PASSWORD. The administrator - password - - - - --tenant_name OS_TENANT_NAME. The - tenant name. - - - - --auth_url OS_AUTH_URL. The URL of the - keystone auth server, for example http://localhost:5000/v2.0'. - - -
    -
    - Using API v3 instead of API v2.0 - Use the following keystone parameters, in combination, to - specify the version of the API to use: - - - --os-endpoint. The - keystone client detects the version - of the API from this parameter. - - - --os-url. Specifies the service - URL from the service catalog lookup. - - - --os-identity-api-version. - Specifies the Identity Service API version. - - - For example, the following parameters indicate the use of - API v3: - --os-url "http://15.253.57.115:35357/v3" --os-identity-api-version 3 - The following parameters indicate the use of API - v2.0: - --os-url "http://15.253.57.115:35357/v2.0" --os-identity-api-version 2.0 -
    -
    - Example usage - The keystone client is set up to expect - commands in the general form of keystone - command - argument, followed by flag-like keyword - arguments to provide additional (often optional) information. - For example, the command user-list and - tenant-create can be invoked as follows: - # Using token auth env variables -export SERVICE_ENDPOINT=http://127.0.0.1:5000/v2.0/ -export SERVICE_TOKEN=secrete_token -keystone user-list -keystone tenant-create --name=demo - -# Using token auth flags -keystone --token=secrete --endpoint=http://127.0.0.1:5000/v2.0/ user-list -keystone --token=secrete --endpoint=http://127.0.0.1:5000/v2.0/ tenant-create --name=demo - -# Using user + password + tenant_name env variables -export OS_USERNAME=admin -export OS_PASSWORD=secrete -export OS_TENANT_NAME=admin -keystone user-list -keystone tenant-create --name=demo - -# Using user + password + tenant_name flags -keystone --username=admin --password=secrete --tenant_name=admin user-list -keystone --username=admin --password=secrete --tenant_name=admin tenant-create --name=demo -
    -
    - Tenants - A tenant is a group of zero or more users. In nova, a - tenant owns virtual machines. In swift, a tenant owns - containers. Users can be associated with more than one tenant. - Each tenant and user pairing can have a role associated with - it. -
    - <literal>tenant-create</literal> - keyword arguments - - - name - - - description (optional, defaults to None) - - - enabled (optional, defaults to True) - - - The following command creates a tenant named - demo: - $ keystone tenant-create --name=demo -
    -
    - <literal>tenant-delete</literal> - arguments - - - tenant_id - - - The following command deletes the tenant: - $ keystone tenant-delete f2b7b39c860840dfa47d9ee4adffa0b3 -
    -
    - <literal>tenant-get</literal> - arguments - - - tenant_id - - - To display details for the tenant, run the following - command: - $ keystone tenant-get f2b7b39c860840dfa47d9ee4adffa0b3 -
    -
    - <literal>tenant-list</literal> - To list all tenants, run the following command: - $ keystone tenant-list -
    -
    - <literal>tenant-update</literal> - arguments - - - name - - - description - - - enabled - - - To update the description and status for a tenant, run - the following command: - $ keystone tenant-update --description newdemo --enabled false f2b7b39c860840dfa47d9ee4adffa0b3 -
    -
    -
    - Users -
    - <literal>user-create</literal> - keyword arguments: - - - name - - - pass - - - email - - - tenant-id - - - enabled (optional, defaults to True) - - - Here is an example: - $keystone user-create --tenant-id=f2b7b39c860840dfa47d9ee4adffa0b3 \ ---name=admin --pass=secrete --email=admin@example.com -
    -
    - <literal>user-delete</literal> - keyword arguments: - - - user - - - Here is an example: - $keystone user-delete 354b53eeb10b445584ac5bf39a768740 -
    -
    - <literal>user-list</literal> - list users in the system, optionally by a specific - tenant (identified by tenant_id) - arguments - - - tenant_id (optional, lists all users if not - specified) - - - example: - $ keystone user-list -
    -
    - <literal>user-update</literal> - arguments - - - name - - - email - - - enable - - - The following command upateds the user with new - email: - $ keystone user-update --email "someone@somewhere.com" 354b53eeb10b445584ac5bf39a768740 -
    -
    - <literal>user-get</literal> - arguments - - - user_id - - - example: - $ keystone user-get 354b53eeb10b445584ac5bf39a768740 -
    -
    - <literal>user-password-update</literal> - arguments - - - pass - - - example: - $ keystone user-password-update --pass foo 03c84b51574841ba9a0d8db7882ac645 -
    -
    -
    - Roles -
    - <literal>role-create</literal> - arguments - - - name - - - example: - -keystone role-create --name=demo - -
    -
    - <literal>role-delete</literal> - arguments - - - role_id - - - example: - $ keystone role-delete 19d1d3344873464d819c45f521ff9890 -
    -
    - <literal>role-list</literal> - example: - $ keystone role-list -
    -
    - <literal>role-get</literal> - arguments - - - role_id - - - example: - $ keystone role-get 19d1d3344873464d819c45f521ff9890 -
    -
    - <literal>user-role-add</literal> - arguments - - - role or role_id - - - user or user_id - - - tenant or tenant_id - - - example: - $ keystone user-role-add --user 3a751f78ef4c412b827540b829e2d7dd \ ---role 03c84b51574841ba9a0d8db7882ac645 --tenant 20601a7f1d94447daa4dff438cb1c209 -
    -
    - <literal>user-role-remove</literal> - arguments - - - role or role_id - - - user or user_id - - - tenant or tenant_id - - - example: - $ keystone user-role-remove --user 3a751f78ef4c412b827540b829e2d7dd \ ---role 03c84b51574841ba9a0d8db7882ac645 --tenant 20601a7f1d94447daa4dff438cb1c209 -
    -
    - <literal>user-role-list</literal> - arguments - - - user_id or user - - - tenant or tenant_id - - - example: - $ keystone user-role-list --user 3a751f78ef4c412b827540b829e2d7dd -
    -
    -
    - Services -
    - <literal>service-create</literal> - keyword arguments - - - name - - - type - - - description - - - example: - $ keystone service create \ ---name=nova \ ---type=compute \ ---description="Nova Compute Service" -
    -
    - <literal>service-list</literal> - arguments - - - service_id - - - example: - $ keystone service-list -
    -
    - <literal>service-get</literal> - arguments - - - service_id - - - example: - $ keystone service-get 08741d8ed88242ca88d1f61484a0fe3b -
    -
    - <literal>service-delete</literal> - arguments - - - service_id - - - example: - $ keystone service-delete 08741d8ed88242ca88d1f61484a0fe3b -
    -
    -
    - Configuring Services to work with Keystone + Configure services to work with the Identity Service Once Keystone is installed and running, services need to be configured to work with it. To do this, we primarily install and configure middleware for the OpenStack service to handle @@ -622,125 +194,10 @@ keystone role-create --name=demo The middleware will pass those data down to the service as headers. -
    - - Setting up credentials - To ensure services that you add to the catalog know about - the users, tenants, and roles, you must create an admin token - and create service users. These sections walk through those - requirements. - -
    - Admin Token - For a default installation of Keystone, before you can - use the REST API, you need to define an authorization token. - This is configured in the keystone.conf - file under the section [DEFAULT]. - In the sample file provided with the keystone project, - the line defining this token is: -
    - [DEFAULT] admin_token = ADMIN -
    - This configured token is a "shared secret" - between keystone and other OpenStack services, and is used - by the client to communicate with the API to create tenants, - users, roles, etc. -
    -
    - Setting up tenants, users, and roles - You must minimally define a tenant, user, and role to - link the tenant and user as the most basic set of details to - get other services authenticating and authorizing with - keystone. - You will also want to create service users for Compute - (nova), Image (glance), Object Storage (swift), etc. to be - able to use to authenticate users against the Identity - service (keystone). The auth_token - middleware supports using either the shared secret described - above as `admin_token` or users for each service. - See the configuration section for a walk through on how to - create tenants, users, and roles. -
    -
    -
    - Setting up services - - -
    - Creating Service Users - To configure the OpenStack services with service users, - we must create a tenant for all the services, and then users - for each of the services. We then assign those service users - an Admin role on the service tenant. This allows them to - validate tokens - and authenticate and authorize other user - requests. - Create a tenant for the services, typically named - 'service' (however, the name can be whatever you choose): - $ keystone tenant-create --name=service - This returns a UUID of the tenant - keep that, you'll - need it when creating the users and specifying the roles. - Create service users for nova, glance, swift, and - neutron (or whatever subset is relevant to your deployment): - $ keystone user-create --name=nova \ - --pass=Sekr3tPass \ - --tenant_id=[the uuid of the tenant] \ - --email=nova@nothing.com - Repeat this for each service you want to enable. Email - is a required field in keystone right now, but not used in - relation to the service accounts. Each of these commands - will also return a UUID of the user. Keep those to assign - the Admin role. - For adding the Admin role to the service accounts, you - need the UUID of the role you want to add. If you don't have - them handy, you can look it up quickly with: - $ keystone role-list - Once you have it, assign the service users to the Admin - role. This is all assuming that you've already created the - basic roles and settings as described in the configuration - section: - $ keystone user-role-add --tenant_id=[uuid of the service tenant] \ - --user=[uuid of the service account] \ - --role=[uuid of the Admin role] -
    -
    - Defining Services - Keystone also acts as a service catalog to let other - OpenStack systems know where relevant API endpoints exist - for OpenStack Services. The OpenStack Dashboard, in - particular, uses this heavily - and this must be configured for the - OpenStack Dashboard to properly function. - The endpoints for these services are defined in a - template, an example of which is in the project as the file - etc/default_catalog.templates. When - keystone uses a template file backend, then changes made to - the endpoints are kept in memory and don't persist if you - restart the service or reboot the machine. Use the SQL - backend when deploying a system for production. - Keystone supports two means of defining the services, - one is the catalog template, as described above - in which - case everything is detailed in that template. - The other is a SQL backend for the catalog service, in - which case after keystone is online, you must add the - services to the catalog: - $ keystone service-create --name=nova \ - --type=compute \ - --description="Nova Compute Service" -keystone service-create --name=ec2 \ - --type=ec2 \ - --description="EC2 Compatibility Layer" -keystone service-create --name=glance \ - --type=image \ - --description="Glance Image Service" -keystone service-create --name=keystone \ - --type=identity \ - --description="Keystone Identity Service" -keystone service-create --name=swift \ - --type=object-store \ - --description="Swift Service" -
    + + + +
    Setting Up Middleware @@ -844,6 +301,7 @@ use = egg:swift#healthcheck Here's an example: [DEFAULT] + bind_port = 8080 user = <user> @@ -888,10 +346,9 @@ admin_token = ADMIN - You can then access directly your Swift via the S3 + You can then access directly your Swift through the S3 API, here's an example with the `boto` library: - -import boto + import boto import boto.s3.connection connection = boto.connect_s3( @@ -991,6 +448,7 @@ user_name_attribute = cn only read access, in such case the configuration is: [ldap] + user_allow_create = False user_allow_update = False user_allow_delete = False @@ -1098,7 +556,6 @@ admin_password = keystone123 granted access to the 'Admin' role on the 'admin' tenant.
    -
    Configuring Keystone SSL support diff --git a/doc/src/docbkx/openstack-compute-admin/section_keystone_middleware.xml b/doc/src/docbkx/openstack-compute-admin/section_keystone_middleware.xml new file mode 100644 index 0000000000..2953d06f8f --- /dev/null +++ b/doc/src/docbkx/openstack-compute-admin/section_keystone_middleware.xml @@ -0,0 +1,87 @@ + +
    + Set up middleware for the Identity Service + +
    + Keystone Auth-Token Middleware + The Keystone auth_token middleware is a WSGI component + that can be inserted in the WSGI pipeline to handle + authenticating tokens with Keystone. +
    +
    + Configuring Nova to use Keystone + When configuring Nova, it is important to create a nova + user in the service tenant and include the nova user's login + information in /etc/nova/nova.conf +
    +
    + Configuring Swift to use Keystone + Similar to Nova, swift can be configured to use Keystone + for authentication rather than its built in 'tempauth'. + + + Add a service endpoint for Swift to Keystone + + + Configure the paste file for swift-proxy, + /etc/swift/proxy-server.conf. + + + + Reconfigure Swift's proxy server to use Keystone + instead of TempAuth. Here's an example + `/etc/swift/proxy-server.conf`: + +[DEFAULT] +bind_port = 8888 +user = <user> + +[pipeline:main] +pipeline = catch_errors healthcheck cache authtoken keystone proxy-server + +[app:proxy-server] +use = egg:swift#proxy +account_autocreate = true + +[filter:keystone] +paste.filter_factory = keystoneclient.middleware.swift_auth:filter_factory +operator_roles = admin, swiftoperator + +[filter:authtoken] +paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory +# Delaying the auth decision is required to support token-less +# usage for anonymous referrers ('.r:*'). +delay_auth_decision = true +service_port = 5000 +service_host = 127.0.0.1 +auth_port = 35357 +auth_host = 127.0.0.1 +auth_token = ADMIN +admin_token = ADMIN +cache = swift.cache + +[filter:cache] +use = egg:swift#memcache +set log_name = cache + +[filter:catch_errors] +use = egg:swift#catch_errors + +[filter:healthcheck] +use = egg:swift#healthcheck + + + Restart swift services. + + + Verify that the Identity service, Keystone, is + providing authentication to Object Storage (Swift). + + $ swift -V 2 -A http://localhost:5000/v2.0 -U admin:admin -K ADMIN stat + + + +
    +
    diff --git a/doc/src/docbkx/openstack-user/pom.xml b/doc/src/docbkx/openstack-user/pom.xml index 637e4b5981..116dc3543a 100644 --- a/doc/src/docbkx/openstack-user/pom.xml +++ b/doc/src/docbkx/openstack-user/pom.xml @@ -21,7 +21,6 @@ com.rackspace.cloud.api clouddocs-maven-plugin 1.8.0 - @@ -32,8 +31,6 @@ generate-sources bk-user-guide.xml - 0 - external appendix toc article/appendix nop @@ -47,6 +44,9 @@ qandadiv toc qandaset toc reference toc,title set toc,title + enduser + 0 + external 1 target/docbkx/webhelp/ user-guide @@ -55,6 +55,7 @@ set toc,title + enduser false true true diff --git a/doc/src/docbkx/openstack-user/src/ch_cli.xml b/doc/src/docbkx/openstack-user/src/ch_cli.xml index 801934ac79..5262e2768b 100644 --- a/doc/src/docbkx/openstack-user/src/ch_cli.xml +++ b/doc/src/docbkx/openstack-user/src/ch_cli.xml @@ -9,26 +9,15 @@ OpenStack command-line clients - - - - - - - - - - - diff --git a/doc/src/docbkx/openstack-user/src/ch_dashboard.xml b/doc/src/docbkx/openstack-user/src/ch_dashboard.xml index 2802023c9a..334e9fd784 100644 --- a/doc/src/docbkx/openstack-user/src/ch_dashboard.xml +++ b/doc/src/docbkx/openstack-user/src/ch_dashboard.xml @@ -11,14 +11,15 @@ As a cloud end user, the OpenStack dashboard lets you to provision your own resources within the limits set by - administrators. You can modify these examples to create other + administrators.You can modify these examples to create other types and sizes of server instances. + - + diff --git a/doc/src/docbkx/openstack-user/src/section_cli_configure_instances.xml b/doc/src/docbkx/openstack-user/src/section_cli_configure_instances.xml index e2a024ee43..5b8c9922da 100644 --- a/doc/src/docbkx/openstack-user/src/section_cli_configure_instances.xml +++ b/doc/src/docbkx/openstack-user/src/section_cli_configure_instances.xml @@ -76,13 +76,13 @@
    Add or import keypairs - To add or import keys + To add a key You can generate a keypair or upload an existing public key. To generate a keypair, run the following command: - $ nova keypair-add KEY_NAME > MY_KEY.pem + $ nova keypair-add KEY_NAME > MY_KEY.pem The command generates a keypair named KEY_NAME, writes the private key to the @@ -94,19 +94,19 @@ To set the permissions of the MY_KEY.pem file, run the following command: - $ chmod 600 MY_KEY.pem + $ chmod 600 MY_KEY.pem The command changes the permissions of the MY_KEY.pem file so that only you can read and write to it. - - + + To import a key If you have already generated a keypair with the public key located at ~/.ssh/id_rsa.pub, run the following command to upload the public key: - $ nova keypair-add --pub_key ~/.ssh/id_rsa.pub KEY_NAME + $ nova keypair-add --pub_key ~/.ssh/id_rsa.pub KEY_NAME The command registers the public key at the Nova database and names the keypair KEY_NAME. @@ -117,36 +117,30 @@ $ nova keypair-list - - -
    Configure security groups and rules - To list security groups + To configure security groups - To list all security groups for the current - project, including descriptions, enter the - following command: + To list all security groups + To list security groups for the current project, + including descriptions, enter the following + command: $ nova secgroup-list - - - To create a security group + To create a security group To create a security group with a specified name and description, enter the following command: - $ nova secgroup-create SEC_GROUP_NAME GROUP_DESCRIPTION + $ nova secgroup-create SEC_GROUP_NAME GROUP_DESCRIPTION - - - To delete a security group + To delete a security group To delete a specified group, enter the following command: - $ nova secgroup-delete SEC_GROUP_NAME + $ nova secgroup-delete SEC_GROUP_NAME You cannot delete the default security group for a project. Also, you cannot delete a @@ -164,89 +158,94 @@ details, see . - List the existing rules for a security group: - $ nova secgroup-list-rules SEC_GROUP_NAME + To list the rules for a security group + $ nova secgroup-list-rules SEC_GROUP_NAME - To allow SSH access to the instances, choose one - of the following sub-steps: + To allow SSH access to the instances + Choose one of the following sub-steps: - Add rule for all IP addresses + Add rule for all + IPs Either from all IP addresses (specified as IP subnet in CIDR notation as 0.0.0.0/0): - $ nova secgroup-add-rule SEC_GROUP_NAME tcp 22 22 0.0.0.0/0 + $ nova secgroup-add-rule SEC_GROUP_NAME tcp 22 22 0.0.0.0/0 - Add rule for other security + <title wordsize="20">Add rule for security groups Alternatively, you can allow only IP addresses from other security groups (source groups) to access the specified port: $ nova secgroup-add-group-rule --ip_proto tcp --from_port 22 \ - --to_port 22 SEC_GROUP_NAME SOURCE_GROUP_NAME + --to_port 22 SEC_GROUP_NAME SOURCE_GROUP_NAME - To allow pinging the instances, choose from one - of the following sub-steps: + To allow pinging the instances + Choose one of the following sub-steps: - Either from all IP addresses (specified - as IP subnet in CIDR notation as - 0.0.0.0/0): - $ nova secgroup-add-rule SEC_GROUP_NAME icmp -1 -1 0.0.0.0/0 - This command allows access to all codes - and all types of ICMP traffic, - respectively. + To allow pinging from + IPs + Specify all IP addresses as IP subnet in + CIDR notation: + 0.0.0.0/0. This + command allows access to all codes and all + types of ICMP traffic, + respectively: + $ nova secgroup-add-rule SEC_GROUP_NAME icmp -1 -1 0.0.0.0/0 - Alternatively, you can allow only - members of other security groups (source - groups) to ping instances: + To allow pinging from + other security groups + To allow only members of other security + groups (source groups) to ping + instances: $ nova secgroup-add-group-rule --ip_proto icmp --from_port -1 \ - --to_port -1 SEC_GROUP_NAME SOURCE_GROUP_NAME + --to_port -1 SEC_GROUP_NAME SOURCE_GROUP_NAME - To allow access through UDP port, such as + To allow access through UDP port + To allow access through a UDP port, such as allowing access to a DNS server that runs on a VM, complete one of the following sub-steps: - Either from all IP addresses (specified - as IP subnet in CIDR notation as - 0.0.0.0/0): - $ nova secgroup-add-rule SEC_GROUP_NAME udp 53 53 0.0.0.0/0 + To allow UDP access from IPs + Specify all IP addresses as IP subnet in + CIDR notation: + 0.0.0.0/0.$ nova secgroup-add-rule SEC_GROUP_NAME udp 53 53 0.0.0.0/0 - Alternatively, you can allow only IP - addresses from other security groups - (source groups) to access the specified - port: + To allow UDP access + To allow only IP addresses from other + security groups (source groups) to access + the specified port: $ nova secgroup-add-group-rule --ip_proto udp --from_port 53 \ - --to_port 53 SEC_GROUP_NAME SOURCE_GROUP_NAME + --to_port 53 SEC_GROUP_NAME SOURCE_GROUP_NAME - To delete security group rules, you must specify - the same arguments that you used to create the + To delete a security group rule, specify the + same arguments that you used to create the rule. To delete the security rule that you created in : - $ nova secgroup-delete-rule SEC_GROUP_NAME tcp 22 22 0.0.0.0/0 + $ nova secgroup-delete-rule SEC_GROUP_NAME tcp 22 22 0.0.0.0/0 To delete the security rule that you created in : $ nova secgroup-delete-group-rule --ip_proto tcp --from_port 22 \ - --to_port 22 SEC_GROUP_NAME SOURCE_GROUP_NAME + --to_port 22 SEC_GROUP_NAME SOURCE_GROUP_NAME
    -