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。

  1.  打开chrome。
  2. 点击更多工具-->扩展程序-->加载已解压的扩展程序-->选择下载的安装包文件,稍等即可安装成功。
  3. 安装成功之后在扩展程序中有已经安装好的postman,直接运行。

运行postman如下图所示:

简单使用

获取token

token是环境可操作的前提,openstack登陆时填写的用户名+密码,登陆之后的操作都是使用token。获取token需要填写的内容如下:

  1. 请求方式为POST
  2. 请求的URL为 http://controller-ip:5000/v2.0/tokens。
  3. 请求的body格式为raw,JSON格式。
  4. 请求的body具体内容如下表
{
"auth":{
"passwordCredentials":
{
"username":"admin", //登陆用户名
"password":"stack2015" //登陆用户密码
},
"tenantName":"admin" //登陆用户所属项目
}
}

下图为详细的填写内容,1-6分别是:

  1. 请求方式为POST
  2. 请求URL地址
  3. 传入内容body
  4. body的内容的类型为raw
  5. body的内容的格式为JSON
  6. 具体的body内容

body内容为用户信息,如果是使用admin用户登录,用户名为admin,密码为*******,租户名为 admin。

返回信息如下,具体的内容包括

  1. 获得的token值
  2. 搭建的环境中各服务的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中从上到下的作用分别是:

  1. admin管理用户的URL
  2. 域名
  3. 内部服务
  4. nova服务的id
  5. 公共服务

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个点,分别是:

  1. 请求类型。
  2. 请求的URL地址,上面已经分析过完整的地址。
  3. 设置访问的header,这里是设置token的key。第一步已经获取了token的值,剩余的访问都是使用token处理。
  4. 设置token的值。

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

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

上面介绍的是GET操作,GET操作一般都是查看内容,不涉及到传值。restful api的另一大操作是需要POST操作,当需要传入一些参数去改变操作对象时,使用为POST的类型。以暂停虚拟机为例,操作是类型+路径+body。

  1. 类型为POST。
  2. 路径为/servers/server-id/action。server_id为上一步查询到的id信息。
  3. body是填入的暂停的动作,具体见官方手册。

暂停主机:

暂停虚拟机填写的参数分别是:

  1. 请求类型为post请求
  2. URL为/servers/server-id/action
  3. 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。记下备用。

四、创建虚拟机

获取参数

到目前为止,我们已经集齐了三颗龙珠,不是三个参数,接下来就可以创建虚拟机了。镜像、规格、网络分别如下:

  1. 镜像 c980b3ee-99e7-4372-9ce4-354e7e7647fe
  2. 规格 e941b823-cdb0-45c5-9f0d-148770588970
  3. 网络 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的更多相关文章

  1. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)

    写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...

  2. Python自动化开发 - RESTful API

    本节内容 1.  RESTful 简介 2.  RESTful 设计指南 3.  Django REST Framework 最佳实践 4.  理论拓展与开放平台 5.  API文档化与测试 一  R ...

  3. 初识restful api接口

    一.restful api接口举例 实现功能 传统方式 restful方式 url HTTP方法 url HTTP方法 查询 /user/query?name=knyel GET /user?name ...

  4. RESTful风格与RESTful Api

    REST(representational state transfer)(表述性状态转移),词汇解析: 1.representational 表述性:指资源以用各种形式来表述,包括 XML.JSON ...

  5. OpenStack设计与实现5——RESTful API和WSGI

    转https://segmentfault.com/a/1190000004361778 Tips:文章为拜读@xingjiarong 后有感而做的分享,先对作者表示感谢,附原文地址:http://b ...

  6. Openstack创建虚拟机 Restful api和RPC调用

    Horizon前台界面用于接受用户的输入或动作(action),然后将这些参数构造成RESTful API(https://developer.openstack.org/api-ref/comput ...

  7. Flask 学习笔记(二):RESTful API

    概括 URL:需要操作的对象,也就是资源 HTTP method:我要对该对象做什么(POST 增.DELETE 删.GET 查.PUT 和 PATCH 改) HTTP status code:操作的 ...

  8. OpenStack Restful API框架介绍

    1  pecan框架介绍 1.1  什么是pecan pecan是一个轻量级的python web框架,最主要的特点是提供了简单的配置即可创建一个wsgi对象并提供了基于对象的路由方式. 主要提供的功 ...

  9. Openstack Restful API 开发框架 Paste + PasteDeploy + Routes + WebOb

    目录 目录 Paste PasteDeploy Routes WebOb 简介 WSGI入口 Paste和PasteDeploy 配置文件 pasteini 中间件的实现 Routes WebOb 参 ...

随机推荐

  1. head first python菜鸟学习笔记(第三章)

    1.os.chdir()切换到指定目录下,os.getcwd(),得到当前目录. >>> import os>>> os.chdir('D:\\CodeDocume ...

  2. 重要:关于PPT转图片需要注意的问题

    关于PPT转图片的问题需要注意的问题   我们有一个项目做过直接上传ppt的功能,但是网页不可能显示ppt,所以只能把ppt转成pdf或者图片来显示,我们的做法是转成了图片,然后使用swiper做成类 ...

  3. python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言)

    python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言) 感觉要总结总结了,希望这次能写个系列文章分享分享心得,和大神们交流交流,提升提升. 因为 ...

  4. 安装 Qt 及所需 gcc 等

    嫌麻烦,下载离线安装包一次性装好 Qt 及 Qt Creator (Community) Qt 安装包下载地址 http://download.qt.io/official_releases/qt/ ...

  5. codeblocks+mbedtls库配置

    网上都没有找到window下mbedtls的相关配置,或许是太简单了.希望可以帮助那些像我这样的小白一枚. 下载 github的下载:https://github.com/ARMmbed/mbedtl ...

  6. 如何在HTTP头中隐藏PHP版本号

    PHP 配置默认允许服务器在 HTTP 响应头 X-Powered-By 中显示安装在服务器上的 PHP 版本.出于服务器安全原因(虽然不是主要的要担心的威胁),建议你禁用或隐藏此信息,避免那些针对你 ...

  7. PTA题---求两个有序序列中位数所体现的思想。

    ---恢复内容开始--- 近日,在做PTA题目时,遇到了一个这样的题,困扰了很久.题目如下:已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A​0​​,A​1​​, ...

  8. windows10版本1709 在桌面和文件中点击右键,会引起卡顿

    windows自动升级到1709版本后出现的问题,而之前是没有这种问题的. 最终解决办法:(需要设置注册表) 运行:快捷键Win+R regedit 路径:可直接复制后粘贴+回车 HKEY_CLASS ...

  9. 简单用数组模拟顺序栈(c++版)适合新手

    **栈是一种操作受限制的线性表,太多官方的话我也不说了,我们都知道栈元素是先进后出的,它有两种存储结构,分别是顺序存储结构和链式存储结构. **今天我先记一下顺序存储结构,后面我会加上链式存储结构的. ...

  10. 大白话Vue源码系列(03):生成AST

    阅读目录 AST 节点定义 标签的正则匹配 解析用到的工具方法 解析开始标签 解析结束标签 解析文本 解析整块 HTML 模板 未提及的细节 本篇探讨 Vue 根据 html 模板片段构建出 AST ...