openstack操作之二 restful api
Restful api 是openstack各服务调用的接口,简单理解为可以通过网络去调用的函数。postman是一款前端调用工具,测试后端接口的时候往往是使用该工具去验证。在openstack的使用中,可以使用postman调用openstack restful接口。这里要区别命令行和restful接口,命令行的使用是调用restful来实现的。所以,不管是命令行还是horizon都是调用了openstack中restful api去实现相应的功能。本节希望通过postman调用接口的方式进一步去剖析openstack。
安装postman
一、下载postman离线安装包。链接: https://pan.baidu.com/s/1kUVxKI7 密码: ttmw
二、chrome安装postman。
- 打开chrome。
- 点击更多工具-->扩展程序-->加载已解压的扩展程序-->选择下载的安装包文件,稍等即可安装成功。
- 安装成功之后在扩展程序中有已经安装好的postman,直接运行。

运行postman如下图所示:
简单使用
获取token
token是环境可操作的前提,openstack登陆时填写的用户名+密码,登陆之后的操作都是使用token。获取token需要填写的内容如下:
- 请求方式为POST
- 请求的URL为 http://controller-ip:5000/v2.0/tokens。
- 请求的body格式为raw,JSON格式。
- 请求的body具体内容如下表
{
"auth":{
"passwordCredentials":
{
"username":"admin", //登陆用户名
"password":"stack2015" //登陆用户密码
},
"tenantName":"admin" //登陆用户所属项目
}
}
下图为详细的填写内容,1-6分别是:
- 请求方式为POST
- 请求URL地址
- 传入内容body
- body的内容的类型为raw
- body的内容的格式为JSON
- 具体的body内容
body内容为用户信息,如果是使用admin用户登录,用户名为admin,密码为*******,租户名为 admin。

返回信息如下,具体的内容包括
- 获得的token值
- 搭建的环境中各服务的restful 端点
注意这个返回状态信息,200 OK表示请求正确。状态是判断请求是否成功的重要依据。该请求返回类型是http标准请求码,常见的请求码如下:
- 200 - OK 一切正常,对GET和POST请求的应答文档跟在后面。
- 201 - Created 服务器已经创建了文档,Location头给出了它的URL。
- 202 - Accepted 已经接受请求,但处理尚未完成。
- 400 - Bad Request 请求出现语法错误。
- 401 - Unauthorized 访问被拒绝,客户试图未经授权访问受密码保护的页面。
- 404 - Not Found 无法找到指定位置的资源。这也是一个常用的应答。

如下是完整的返回信息,在获取token的同时,返回的信息可以看到返回的还有所有服务的请求地址即Catalog。其中标蓝的部分要重点注意,是openstack核心服务的访问端点。
{
"access": {
"token": {
"issued_at": "2017-12-26T09:29:34.000000Z",
"expires": "2017-12-26T10:29:33.000000Z",
"id": "gAAAAABaQhZ-a-i7B_f8Vtrlh0NcEyDe9h0RcDLjqXYduJAA-GbA599iLthfbj4_rJMoHx3XNIiIZs18BDWKTu8X1pcaccWbd2BapglewqWreTjnT--fuVrQpN8bzEmAk_pZpC6MFEY93VzsuZGRGAym7hNGRKgfsgyhChJXalPVIDMLLwYCu2s",
"tenant": {
"description": "Bootstrap project for initializing the cloud.",
"enabled": true,
"id": "ffd1a0df301045f1b20eef7d9e126dbf",
"name": "admin"
},
"audit_ids": [
"b7Q0lp05SI2xcoBYBHAQwQ"
]
},
"serviceCatalog": [
{
"endpoints": [
{
"adminURL": "http://controller:8774/v2.1",
"region": "RegionOne",
"internalURL": "http://controller:8774/v2.1",
"id": "adc922e83ef447e7abca68e96119e60a",
"publicURL": "http://controller:8774/v2.1"
}
],
"endpoints_links": [],
"type": "compute",
"name": "nova"
},
{
"endpoints": [
{
"adminURL": "http://controller:9696",
"region": "RegionOne",
"internalURL": "http://controller:9696",
"id": "3fa6e602366b424fb51002436b7485c8",
"publicURL": "http://controller:9696"
}
],
"endpoints_links": [],
"type": "network",
"name": "neutron"
},
{
"endpoints": [
{
"adminURL": "http://controller:8776/v2/ffd1a0df301045f1b20eef7d9e126dbf",
"region": "RegionOne",
"internalURL": "http://controller:8776/v2/ffd1a0df301045f1b20eef7d9e126dbf",
"id": "402b52c472f241fe84e994ec5fb90789",
"publicURL": "http://controller:8776/v2/ffd1a0df301045f1b20eef7d9e126dbf"
}
],
"endpoints_links": [],
"type": "volumev2",
"name": "cinderv2"
},
{
"endpoints": [
{
"adminURL": "http://controller:9292",
"region": "RegionOne",
"internalURL": "http://controller:9292",
"id": "39c50e9ed55d4d1486a037a85db863ba",
"publicURL": "http://controller:9292"
}
],
"endpoints_links": [],
"type": "image",
"name": "glance"
},
{
"endpoints": [
{
"adminURL": "http://controller:8776/v1/ffd1a0df301045f1b20eef7d9e126dbf",
"region": "RegionOne",
"internalURL": "http://controller:8776/v1/ffd1a0df301045f1b20eef7d9e126dbf",
"id": "0c827a2a02e84ed5aa8dc113c1329b33",
"publicURL": "http://controller:8776/v1/ffd1a0df301045f1b20eef7d9e126dbf"
}
],
"endpoints_links": [],
"type": "volume",
"name": "cinder"
},
{
"endpoints": [
{
"adminURL": "http://controller:8080/v1",
"region": "RegionOne",
"internalURL": "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf",
"id": "0ee0b857383a44d98970cce3fd0cdfd2",
"publicURL": "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf"
}
],
"endpoints_links": [],
"type": "object-store",
"name": "swift"
},
{
"endpoints": [
{
"adminURL": "http://controller:8778",
"region": "RegionOne",
"internalURL": "http://controller:8778",
"id": "43881ded3c564795908280a7408ec8a6",
"publicURL": "http://controller:8778"
}
],
"endpoints_links": [],
"type": "placement",
"name": "placement"
},
{
"endpoints": [
{
"adminURL": "http://controller:35357/v3/",
"region": "RegionOne",
"internalURL": "http://controller:5000/v3/",
"id": "0042fccfe6d6476385e2d48692cfebff",
"publicURL": "http://controller:5000/v3/"
}
],
"endpoints_links": [],
"type": "identity",
"name": "keystone"
}
],
"user": {
"username": "admin",
"roles_links": [],
"id": "99c64dce212547a08f68a48f5b86044e",
"roles": [
{
"name": "admin"
}
],
"name": "admin"
},
"metadata": {
"is_admin": ,
"roles": [
"39a6815cad0e4e7c879de0092076ff3f"
]
}
}
}
以nova服务为例,具体分析其中的内容。包括:

其中endpoints的内容是nova服务在keystone服务中注册的restful路径。在endpoint中从上到下的作用分别是:
- admin管理用户的URL
- 域名
- 内部服务
- nova服务的id
- 公共服务
nova服务操作
准备工作:
- restful api路径
在openstack社区中有openstack restful api的使用文档。https://developer.openstack.org/api-guide/quick-start/
- token值
token值是在上面使用用户名和密码获取。
完成以上准备工作我们来开始使用。首先查看官方文档中nova服务的api的描述。从api使用手册中进入Compute API。

如下图看到的都是nova的操作,每个操作都是对应一个类型+路径。类型有GET查看类的操作,有POST设置类的操作。路径为/servers。以查看环境中的虚拟机为例,操作类型为GET,路径为/servers。这里的路径没有包括前面的端点,因为每个服务的端点端口号不同,版本信息不同。结合获取token时返回的端点信息为一个完整的路径。nova的端点信息为 http://controller:8774/v2.1,所以请求的完整路径为http://controller:8774/v2.1/servers。使用时将controller换成控制节点的ip地址即可。

查询主机:
填写postman,填写的内容有4个点,分别是:
- 请求类型。
- 请求的URL地址,上面已经分析过完整的地址。
- 设置访问的header,这里是设置token的key。第一步已经获取了token的值,剩余的访问都是使用token处理。
- 设置token的值。

返回信息为环境中所有虚拟机的简要信息。我的环境中只有一个虚拟机,是上一篇文章中创建的虚拟机myinstance。注意name和id两个参数。一般在openstack中要么使用name操作虚拟机,要么使用id操作虚拟机,两者可以互换。记下该id,后面需要使用。

如果想要查看虚拟机更详细的信息,可以使用/server/detail路径的api。如下是myinstance的详细信息,可以分析出使用的网络名为mynetwork。更多信息可以亲自动手查看一次。

上面介绍的是GET操作,GET操作一般都是查看内容,不涉及到传值。restful api的另一大操作是需要POST操作,当需要传入一些参数去改变操作对象时,使用为POST的类型。以暂停虚拟机为例,操作是类型+路径+body。
- 类型为POST。
- 路径为/servers/server-id/action。server_id为上一步查询到的id信息。
- body是填入的暂停的动作,具体见官方手册。

暂停主机:
暂停虚拟机填写的参数分别是:
- 请求类型为post请求
- URL为/servers/server-id/action
- body填入动作:暂停。

再次查询该虚拟机的详细信息是,能够查询到vm_state是paused状态。

通过上面postman调用restful api接口的操作,已经介绍了postman的基本使用技巧和restful api的使用方式。下面通过完成创建一个虚拟机的一个小目标来进一步学习restful api的使用技巧。
创建虚拟机
前言:如下图是官方文档中给出的创建虚拟机的body内容。有四个参数:
- name
- imageRef
- flavorRef
- network
name是我们自己定义的,剩余三个参数要自己查找。想要创建一个虚拟机,首先要查询到imageref、flavorref、networks,并选择合适的内容。然后组装查询到的内容,创建虚拟机。

准备工作:
一、查询镜像url。
从官网上找到镜像api介绍


填写URL时和nova操作一样,要知道image服务端点,从获取token时返回的的服务类型中查找,可以得知image的端点是:http://controller:9292。注意不要忘记了token。

经过查询可知镜像的id为c980b3ee-99e7-4372-9ce4-354e7e7647fe。记下备用。
二、查询flavor

使用nova的端点信息,加上/flavors路径。完整路径为:http://controller_ip:8774/v2.1/flavors。

从返回信息中记下名为myflavor,flavor id为 e941b823-cdb0-45c5-9f0d-148770588970。记下备用。
三、查询network

查询官网网络api,可知,路径为/v2.0/networks,完整的URL为:http://controller:9696/v2.0/networks。

从查询结果中选择名为mynetwork的网络, network id 为4bc273a0-e9a5-4a26-b713-509704d19368。记下备用。
四、创建虚拟机
获取参数
到目前为止,我们已经集齐了三颗龙珠,不是三个参数,接下来就可以创建虚拟机了。镜像、规格、网络分别如下:
- 镜像 c980b3ee-99e7-4372-9ce4-354e7e7647fe
- 规格 e941b823-cdb0-45c5-9f0d-148770588970
- 网络 4bc273a0-e9a5-4a26-b713-509704d193

组装参数
根据手册组装我们自己的body信息,其中注意network的格式。
{
"server": {
"name": "my_second_instance",
"imageRef": "c980b3ee-99e7-4372-9ce4-354e7e7647fe",
"flavorRef": "e941b823-cdb0-45c5-9f0d-148770588970",
"networks": [{"uuid": "4bc273a0-e9a5-4a26-b713-509704d19368"}]
}
}
填写参数
根据官网给出的参数,类型+URL+body。类型为POST,URL为http://controller_ip:8774/v2.1/servers,body为上面填写好的内容。

返回信息如下:

再次查看环境中虚拟机,可以看到刚刚创建的名为my_second_instance的主机。

简单总结:
restful api能够完成所有对openstack的操作,并且使用restful api已经比较深入的接触了openstack,至少知道了各种服务接口、服务之间的调用、组件之间的运作机制等。这对理解openstack框架有着深刻的意义。走到已经揭开了openstack朦胧的面纱,能见其轮廓。
openstack操作之二 restful api的更多相关文章
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)
写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...
- Python自动化开发 - RESTful API
本节内容 1. RESTful 简介 2. RESTful 设计指南 3. Django REST Framework 最佳实践 4. 理论拓展与开放平台 5. API文档化与测试 一 R ...
- 初识restful api接口
一.restful api接口举例 实现功能 传统方式 restful方式 url HTTP方法 url HTTP方法 查询 /user/query?name=knyel GET /user?name ...
- RESTful风格与RESTful Api
REST(representational state transfer)(表述性状态转移),词汇解析: 1.representational 表述性:指资源以用各种形式来表述,包括 XML.JSON ...
- OpenStack设计与实现5——RESTful API和WSGI
转https://segmentfault.com/a/1190000004361778 Tips:文章为拜读@xingjiarong 后有感而做的分享,先对作者表示感谢,附原文地址:http://b ...
- Openstack创建虚拟机 Restful api和RPC调用
Horizon前台界面用于接受用户的输入或动作(action),然后将这些参数构造成RESTful API(https://developer.openstack.org/api-ref/comput ...
- Flask 学习笔记(二):RESTful API
概括 URL:需要操作的对象,也就是资源 HTTP method:我要对该对象做什么(POST 增.DELETE 删.GET 查.PUT 和 PATCH 改) HTTP status code:操作的 ...
- OpenStack Restful API框架介绍
1 pecan框架介绍 1.1 什么是pecan pecan是一个轻量级的python web框架,最主要的特点是提供了简单的配置即可创建一个wsgi对象并提供了基于对象的路由方式. 主要提供的功 ...
- Openstack Restful API 开发框架 Paste + PasteDeploy + Routes + WebOb
目录 目录 Paste PasteDeploy Routes WebOb 简介 WSGI入口 Paste和PasteDeploy 配置文件 pasteini 中间件的实现 Routes WebOb 参 ...
随机推荐
- JavaScript学习笔记(十二)——箭头函数(Arrow Function)
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- python之列表(list)的使用方法介绍
python之列表(list)介绍 在python的使用过程中,我们经常会用到列表,然而经常会遇到疑惑,下面我将详细介绍下列表使用方法. 一.列表 列表经常用到的功能使增.删.改和查功能. 1. 增 ...
- react入门到进阶(一)
一.何为react Facebook在F8会议上首次提出这个概念,一套全新的框架就此诞生. React 不是一个完整的 MVC.MVVM 框架,其只负责 View 层 React 跟 Web Comp ...
- idea+scala+spark遇到的一些问题
1.windows中以本地模式运行spark遇到"Could not locate executable null\bin\winutils.exe in the Hadoop binari ...
- hotspot虚拟机的调试
3这篇文章,怎么说呢.是踩了很多坑得出来了,也是在自己快要崩溃的时候得出来了的. 连续踩了差不多10来个小时的坑,还好是出来了. 这篇文章是调试虚拟机的,其实网上也能找到一些文章,但是每个人的环境不一 ...
- redis 梳理笔记(一)
一 redis 数据格式 短连接 长连接pconnect tcp协议 交互数据格式 交互采用特殊的格式 \r\n 1."+"号开头表示单行字符串的回复 set aa aa ...
- [C#]使用Process的StandardInput与StandardOutput写入读取控制台数据
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...
- java连接VMware虚拟机Oracle数据库问题
最近在电脑上装了虚拟机,为的是在虚拟机上安装Oracle数据库,Oracle实在太占内存,配置低的电脑装个Oracle几乎就瘫了,没办法,搞个虚拟机玩玩.我虚拟机用的是xp系统,顺便怀念下经典.装好O ...
- centos 下安装pptp (vpn) 的方法
废话少说 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...
- 室内地图1:从CAD到Map(画图,发布,路径导航)
首先这个教程整理,比较偏细节. 因为我本身不是做GIS,所以可能有点流水账,当然错漏难免,恳请指正. 当我们做定位的时候,想要可视化展示,室外当然可以直接使用google,百度的底图.对于室内,有两种 ...