SlideShare a Scribd company logo
1 of 21
Download to read offline
OpenStack API's and WSGI


                 http://github.com/lhrc-mikeyp/Presentations




Mike Pittaro
La Honda Research Center
mikeyp@LaHondaResearch.org
@pmikeyp
     This work is licensed under the Creative Commons Attribution-
     NonCommercial-ShareAlike 3.0 Unported License.
Introduction
●
    Taking a peek under the hood of OpenStack
    ●
        From the API inwards
●
    Prerequisites
    ●
        A basic understanding of Web, REST, and HTTP
    ●
        Some knowledge of Python
●
    Why learn this ?
    ●
        Understand OpenStack's API implementation
    ●
        Easier to understand and troubleshoot
    ●
        First step to modifying OpenStack
    ●
        First step to extending API's
How Deep is a 'peek' ?
●
    Everything should be made as simple as
    possible, but not simpler.
         ●
             Albert Enistein



●
    Simple is Better than Complex
●
    Complex is better than Complicated
         ●
             PEP 20
What is OpenStack ?
●   OpenStack is a global collaboration of developers
    and cloud computing technologists producing
    the ubiquitous open source cloud computing
    platform for public and private clouds.
●   The project aims to deliver solutions for all types
    of clouds by being simple to implement,
    massively scalable, and feature rich.
●   The technology consists of a series of
    interrelated projects delivering various
    components for a cloud infrastructure solution.
How is OpenStack Implemented?
●
    OpenStack is a collection of services
    ●
        Compute (Nova)             ●
                                       Identity (Keystone)
    ●
        Object Storage (Swift)     ●
                                       Dashboard (Horizon)
    ●
        Image Service (Glance)


●
    Each service is a 'WebApp'
    ●
        REST API server ('frontend')
    ●
        One or more backend servers
    ●
        Messaging interface between them
OpenStack API's
●
    All Interaction with OpenStack is via API's
    ●
        http://docs.openstack.org/api/
    ●
        http://api.openstack.org/
●
    API QuickStart
    ●
        http://docs.openstack.org/api/quick-start/content/
●
    The API's use HTTP + json (or xml)
    ●
        Use curl or wget or browser plugins
    ●
        Use any programming language via HTTP libraries
    ●
        Use the Python novaclient library
OpenStack In Action
   ●
       OpenStack includes a nova command
        ●
            It's built using the novaclient library
mikeyp@blade1:devstack$ nova --username admin --password devstack image-list
+--------------------------------------+--------------------------------------------+--------+--------+
|                  ID                  |                    Name                    | Status | Server |
+--------------------------------------+--------------------------------------------+--------+--------+
| 43bafe10-700c-45af-90a8-b5d794812e62 | cirros-0.3.0-x86_64-blank-ramdisk          | ACTIVE |        |
| 45ad4046-9780-4968-83c6-460f168321c7 | cirros-0.3.0-x86_64-blank-kernel           | ACTIVE |        |
| 6216fc7c-7f87-45e0-be0f-eefef2d5be33 | ttylinux-uec-amd64-11.2_2.6.35-15_1        | ACTIVE |        |
| 92a1e0bd-c4a5-4f3f-a66f-1f8b990f2b0e | ttylinux-uec-amd64-11.2_2.6.35-15_1-kernel | ACTIVE |        |
| 95d8db11-b175-43d2-b3de-d7b806e54dde | cirros-0.3.0-x86_64-blank                  | ACTIVE |        |
| e543bb77-5a7d-4ef0-9a7a-92ca6c8a0b35 | cirros-0.3.0-x86_64-rootfs                 | ACTIVE |        |
+--------------------------------------+--------------------------------------------+--------+--------+

mikeyp@blade1:devstack$ nova flavor-list
+----+-----------+-----------+------+-----------+------+-------+-------------+
| ID |    Name   | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor |
+----+-----------+-----------+------+-----------+------+-------+-------------+
| 1 | m1.tiny    | 512       | 0    | 0         |      | 1     | 1.0         |
| 2 | m1.small | 2048        | 10   | 20        |      | 1     | 1.0         |
| 3 | m1.medium | 4096       | 10   | 40        |      | 2     | 1.0         |
| 4 | m1.large | 8192        | 10   | 80        |      | 4     | 1.0         |
| 5 | m1.xlarge | 16384      | 10   | 160       |      | 8     | 1.0         |
+----+-----------+-----------+------+-----------+------+-------+-------------+
Using novaclient
#!/usr/bin/env python

import logging

import novaclient
from novaclient.v1_1 import client

# enable debug logging
logger = logging.getLogger('novaclient.client')
logger.setLevel(logging.DEBUG)
debug_stream = logging.StreamHandler()
logger.addHandler(debug_stream)

auth_url = 'http://10.100.20.22:5000/v2.0'
user = 'admin'
password = 'devstack'
project = 'demo'
region = 'RegionOne'
service = 'compute'

nova = client.Client(user, password, project, auth_url,
                     region_name=region, service_type=service)

results = nova.images.list(detailed=True)
for image in results:
    print image.id, image.name, image.status

mikeyp@blade1:api_examples$ python image_list.py
e543bb77-5a7d-4ef0-9a7a-92ca6c8a0b35 cirros-0.3.0-x86_64-rootfs ACTIVE
95d8db11-b175-43d2-b3de-d7b806e54dde cirros-0.3.0-x86_64-blank ACTIVE
45ad4046-9780-4968-83c6-460f168321c7 cirros-0.3.0-x86_64-blank-kernel ACTIVE
43bafe10-700c-45af-90a8-b5d794812e62 cirros-0.3.0-x86_64-blank-ramdisk ACTIVE
92a1e0bd-c4a5-4f3f-a66f-1f8b990f2b0e ttylinux-uec-amd64-11.2_2.6.35-15_1-kernel ACTIVE
6216fc7c-7f87-45e0-be0f-eefef2d5be33 ttylinux-uec-amd64-11.2_2.6.35-15_1 ACTIVE
Keystone API using urllib2
def get_keystone_token():
    """authenticate against keystone identity service
    returns an auth token, and the service url

   """
   user = 'admin'
   password = 'devstack'
   project = 'demo'
   auth_url = 'http://10.100.20.22:5000/v2.0/tokens'

   auth_request = urllib2.Request(auth_url)
   auth_request.add_header('Content-Type', 'application/json;charset=utf8')
   auth_request.add_header('Accept', 'application/json')
   auth_request.add_header('User-Agent', 'python-mikeyp')

   auth_data = {"auth":
       {"tenantName": project,
        "passwordCredentials": {
           "username": user,
           "password": password}
       }
   }
   auth_request.add_data(json.dumps(auth_data))
   auth_response = urllib2.urlopen(auth_request)
   response_data = json.loads(auth_response.read())

   token = response_data['access']['token']['id']

   service_list = response_data['access']['serviceCatalog']
   for s in service_list:
       if s['type'] == 'compute' and s['name'] == "'Compute Service'":
           break
   nova_url = s['endpoints'][0]['publicURL']
   return (token, nova_url)
Images API using urllib2
#!/usr/bin/env python

import urllib2
import json

# def get_keystone_token():
   # see previous page

token, service_url   = get_keystone_token()

image_api = service_url + '/images/detail'

images_request = urllib2.Request(image_api)
images_request.add_header('Content-Type', 'application/json;charset=utf8')
images_request.add_header('Accept', 'application/json')
images_request.add_header('User-Agent', 'python-mikeyp')
images_request.add_header('X-Auth-Token', token)
images_request.add_header('X-Auth-Project-Id', 'demo')

image_response = urllib2.urlopen(images_request)
image_data = json.loads(image_response.read())
print json.dumps(image_data, indent=4)
What's been happening ?
OpenStack 'Web Stack'
●
    Paste HTTP Server
    ●
        HTTP protocol + networking
●   WebOb requests and responses
    ●
        Wrappers for HTTP Requests and Responses
●   OpenStack code
    ●
        Nova, glance, keystone, etc
●
    Web Service Gateway Interface (WSGI)
    ●
        The specification for web servers and applications
    ●
        WSGI is not code – no import
WSGI In a Nutshell
●   WSGI Application
    ●   A Python callable passed two arguments:
        –   WSGI Environment
        –   A start_response function
    ●   Application calls start_response, and returns response
●   WSGI Server
    ●   The Server calls the application
●   WSGI Middleware
    ●   Both a server and application
    ●   Use to 'wrap' or 'pipeline' requests
Simple WSGI Application
"""Hello World using Paste + WSGI """

from paste import httpserver

def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/html')])
    return ['Hello World']

httpserver.serve(application, host='127.0.0.1', port=8080)
WSGI With WebOb + Paste
wsgi_webob.py
"""Hello World using WebOb, Paste + WSGI """

from webob import Response
from webob.dec import wsgify

from paste import httpserver
from paste.deploy import loadapp

INI_PATH = '/home/mikeyp/Documents/Projects/OpenStack/presentations/api_examples/wsgi_webob.ini'

@wsgify
def application(request):

   return Response('Hello, World of WebOb !')


def app_factory(global_config, **local_config):
    return application

wsgi_app = loadapp('config:' + INI_PATH)

httpserver.serve(wsgi_app, host='127.0.0.1', port=8080)

wsgi_webob_ini.py

[app:main]
paste.app_factory = wsgi_webob:app_factory
WSGI middleware
"""Hello World (authorized version) using WebOb, Paste + WSGI """

from webob import Response
from webob.dec import wsgify
from webob import exc

from paste import httpserver
from paste.deploy import loadapp

INI_PATH = '/home/mikeyp/Documents/Projects/OpenStack/presentations/api_examples/wsgi_webob_mid.ini'

@wsgify
def application(request):

   return Response('Hello, Secret World of WebOb !')

@wsgify.middleware
def auth_filter(request, app):

   if request.headers.get('X-Auth-Token') != 'open-sesame':
       return exc.HTTPForbidden()
   return app(request)

def app_factory(global_config, **local_config):
    return application

def filter_factory(global_config, **local_config):
    return auth_filter

wsgi_app = loadapp('config:' + INI_PATH)

httpserver.serve(wsgi_app, host='127.0.0.1', port=8080)
Paste Middleware Config
[pipeline:main]
pipeline = auth hello

[app:hello]
paste.app_factory = wsgi_webob_mid:app_factory

[filter:auth]
paste.filter_factory = wsgi_webob_mid:filter_factory
Glance API Server – the code
●
    Paste Config file
    ●
        etc/glance-api-config.py
●
    Glance API server startup
    ●
        glance/common/wsgi.py
    ●
        glance/api/v1/router.py
●
    Main glance api files
    ●
        glance/api/v1/images.py
Keystone middleware
●
    Authentication Token Verification
    ●
        keystone/middleware/auth_token.py
    ●
        WSGI middleware
    ●
        Contains filter factory
Details and Complexity
●
    Lots more to learn – but not tonight
    ●
        Pluggable OpenStack API Extensions
    ●
        Front ends and load balancing
    ●
        Threading and concurrency
    ●
        URL mapping and dispatch
References
●   OpenStack
    ●   http://www.openstack.org
●   WSGI
    ●   http://www.wsgi.org
●   Paste Web Server
    ●   http://pythonpaste.org/
●   WebOb
    ●   http://www.webob.org/
●   P3333 (WSGI)
    ●   http://www.python.org/dev/peps/pep-3333/
●   HTTP RFC 2616
    ●   http://www.ietf.org/rfc/rfc2616.txt
●   RESTful Web Services (Book)
    ●   http://shop.oreilly.com/product/9780596529260.do

More Related Content

What's hot

What's hot (20)

Linux Network Stack
Linux Network StackLinux Network Stack
Linux Network Stack
 
DPDK in Containers Hands-on Lab
DPDK in Containers Hands-on LabDPDK in Containers Hands-on Lab
DPDK in Containers Hands-on Lab
 
OVN 設定サンプル | OVN config example 2015/12/27
OVN 設定サンプル | OVN config example 2015/12/27OVN 設定サンプル | OVN config example 2015/12/27
OVN 設定サンプル | OVN config example 2015/12/27
 
Meetup 23 - 02 - OVN - The future of networking in OpenStack
Meetup 23 - 02 - OVN - The future of networking in OpenStackMeetup 23 - 02 - OVN - The future of networking in OpenStack
Meetup 23 - 02 - OVN - The future of networking in OpenStack
 
Fun with Network Interfaces
Fun with Network InterfacesFun with Network Interfaces
Fun with Network Interfaces
 
Open vSwitch Introduction
Open vSwitch IntroductionOpen vSwitch Introduction
Open vSwitch Introduction
 
Linux Performance Profiling and Monitoring
Linux Performance Profiling and MonitoringLinux Performance Profiling and Monitoring
Linux Performance Profiling and Monitoring
 
Ceph issue 해결 사례
Ceph issue 해결 사례Ceph issue 해결 사례
Ceph issue 해결 사례
 
OVN DBs HA with scale test
OVN DBs HA with scale testOVN DBs HA with scale test
OVN DBs HA with scale test
 
SR-IOV ixgbe Driver Limitations and Improvement
SR-IOV ixgbe Driver Limitations and ImprovementSR-IOV ixgbe Driver Limitations and Improvement
SR-IOV ixgbe Driver Limitations and Improvement
 
LinuxCon 2015 Linux Kernel Networking Walkthrough
LinuxCon 2015 Linux Kernel Networking WalkthroughLinuxCon 2015 Linux Kernel Networking Walkthrough
LinuxCon 2015 Linux Kernel Networking Walkthrough
 
Keystone at openstack multi sites
Keystone at openstack multi sitesKeystone at openstack multi sites
Keystone at openstack multi sites
 
[OpenInfra Days Korea 2018] (Track 2) Neutron LBaaS 어디까지 왔니? - Octavia 소개
[OpenInfra Days Korea 2018] (Track 2) Neutron LBaaS 어디까지 왔니? - Octavia 소개[OpenInfra Days Korea 2018] (Track 2) Neutron LBaaS 어디까지 왔니? - Octavia 소개
[OpenInfra Days Korea 2018] (Track 2) Neutron LBaaS 어디까지 왔니? - Octavia 소개
 
Linux Networking Explained
Linux Networking ExplainedLinux Networking Explained
Linux Networking Explained
 
Cobbler - Fast and reliable multi-OS provisioning
Cobbler - Fast and reliable multi-OS provisioningCobbler - Fast and reliable multi-OS provisioning
Cobbler - Fast and reliable multi-OS provisioning
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
 
EBPF and Linux Networking
EBPF and Linux NetworkingEBPF and Linux Networking
EBPF and Linux Networking
 
Overview of Distributed Virtual Router (DVR) in Openstack/Neutron
Overview of Distributed Virtual Router (DVR) in Openstack/NeutronOverview of Distributed Virtual Router (DVR) in Openstack/Neutron
Overview of Distributed Virtual Router (DVR) in Openstack/Neutron
 
Neutron packet logging framework
Neutron packet logging frameworkNeutron packet logging framework
Neutron packet logging framework
 
Linux Profiling at Netflix
Linux Profiling at NetflixLinux Profiling at Netflix
Linux Profiling at Netflix
 

Viewers also liked

Inside neutron 2
Inside neutron 2Inside neutron 2
Inside neutron 2
Robin Gong
 

Viewers also liked (14)

OpenStack API
OpenStack APIOpenStack API
OpenStack API
 
Inside neutron 2
Inside neutron 2Inside neutron 2
Inside neutron 2
 
Python WSGI introduction
Python WSGI introductionPython WSGI introduction
Python WSGI introduction
 
Logisland "Event Mining at scale"
Logisland "Event Mining at scale"Logisland "Event Mining at scale"
Logisland "Event Mining at scale"
 
OpenStack hyeroglyphs
OpenStack hyeroglyphsOpenStack hyeroglyphs
OpenStack hyeroglyphs
 
OpenStack Summit in Hong Kong 参加報告
OpenStack Summit in Hong Kong 参加報告OpenStack Summit in Hong Kong 参加報告
OpenStack Summit in Hong Kong 参加報告
 
Summit 16: Providing Root Cause Analysis to OPNFV Using Pinpoint -the A-CORD ...
Summit 16: Providing Root Cause Analysis to OPNFV Using Pinpoint -the A-CORD ...Summit 16: Providing Root Cause Analysis to OPNFV Using Pinpoint -the A-CORD ...
Summit 16: Providing Root Cause Analysis to OPNFV Using Pinpoint -the A-CORD ...
 
OpenStack の利用
OpenStack の利用OpenStack の利用
OpenStack の利用
 
OPNFV: Overview and Approach to Upstream Integration
OPNFV: Overview and Approach to Upstream IntegrationOPNFV: Overview and Approach to Upstream Integration
OPNFV: Overview and Approach to Upstream Integration
 
How to write a Neutron Plugin - if you really need to
How to write a Neutron Plugin - if you really need toHow to write a Neutron Plugin - if you really need to
How to write a Neutron Plugin - if you really need to
 
OpenStack networking - Neutron deep dive with PLUMgrid
OpenStack networking - Neutron deep dive with PLUMgridOpenStack networking - Neutron deep dive with PLUMgrid
OpenStack networking - Neutron deep dive with PLUMgrid
 
PNDA - Platform for Network Data Analytics
PNDA - Platform for Network Data AnalyticsPNDA - Platform for Network Data Analytics
PNDA - Platform for Network Data Analytics
 
PaNDA - a platform for Network Data Analytics: an overview
PaNDA - a platform for Network Data Analytics: an overviewPaNDA - a platform for Network Data Analytics: an overview
PaNDA - a platform for Network Data Analytics: an overview
 
OpenStack Architecture
OpenStack ArchitectureOpenStack Architecture
OpenStack Architecture
 

Similar to OpenStack API's and WSGI

Similar to OpenStack API's and WSGI (20)

how to use openstack api
how to use openstack apihow to use openstack api
how to use openstack api
 
NTT SIC marketplace slide deck at Tokyo Summit
NTT SIC marketplace slide deck at Tokyo SummitNTT SIC marketplace slide deck at Tokyo Summit
NTT SIC marketplace slide deck at Tokyo Summit
 
Backend, app e internet das coisas com NodeJS no Google Cloud Platform
Backend, app e internet das coisas com NodeJS no Google Cloud PlatformBackend, app e internet das coisas com NodeJS no Google Cloud Platform
Backend, app e internet das coisas com NodeJS no Google Cloud Platform
 
Backend, app e internet das coisas com NodeJS no Google Cloud Platform
Backend, app e internet das coisas com NodeJS no Google Cloud PlatformBackend, app e internet das coisas com NodeJS no Google Cloud Platform
Backend, app e internet das coisas com NodeJS no Google Cloud Platform
 
Django deployment with PaaS
Django deployment with PaaSDjango deployment with PaaS
Django deployment with PaaS
 
Exploring the Final Frontier of Data Center Orchestration: Network Elements -...
Exploring the Final Frontier of Data Center Orchestration: Network Elements -...Exploring the Final Frontier of Data Center Orchestration: Network Elements -...
Exploring the Final Frontier of Data Center Orchestration: Network Elements -...
 
DEVNET-1136 Cisco ONE Enterprise Cloud Suite for Infrastructure Management.
DEVNET-1136	Cisco ONE Enterprise Cloud Suite for Infrastructure Management.DEVNET-1136	Cisco ONE Enterprise Cloud Suite for Infrastructure Management.
DEVNET-1136 Cisco ONE Enterprise Cloud Suite for Infrastructure Management.
 
Docker Logging and analysing with Elastic Stack - Jakub Hajek
Docker Logging and analysing with Elastic Stack - Jakub Hajek Docker Logging and analysing with Elastic Stack - Jakub Hajek
Docker Logging and analysing with Elastic Stack - Jakub Hajek
 
Docker Logging and analysing with Elastic Stack
Docker Logging and analysing with Elastic StackDocker Logging and analysing with Elastic Stack
Docker Logging and analysing with Elastic Stack
 
StrongLoop Overview
StrongLoop OverviewStrongLoop Overview
StrongLoop Overview
 
Zaragoza dev ops-activiti-khd-20181212
Zaragoza dev ops-activiti-khd-20181212Zaragoza dev ops-activiti-khd-20181212
Zaragoza dev ops-activiti-khd-20181212
 
Session: A Reference Architecture for Running Modern APIs with NGINX Unit and...
Session: A Reference Architecture for Running Modern APIs with NGINX Unit and...Session: A Reference Architecture for Running Modern APIs with NGINX Unit and...
Session: A Reference Architecture for Running Modern APIs with NGINX Unit and...
 
Real World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS ApplicationReal World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS Application
 
Openstack Summit Tokyo 2015 - Building a private cloud to efficiently handle ...
Openstack Summit Tokyo 2015 - Building a private cloud to efficiently handle ...Openstack Summit Tokyo 2015 - Building a private cloud to efficiently handle ...
Openstack Summit Tokyo 2015 - Building a private cloud to efficiently handle ...
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCL
 
Angular2 inter3
Angular2 inter3Angular2 inter3
Angular2 inter3
 
使用 Prometheus 監控 Kubernetes Cluster
使用 Prometheus 監控 Kubernetes Cluster 使用 Prometheus 監控 Kubernetes Cluster
使用 Prometheus 監控 Kubernetes Cluster
 
Bare Metal to OpenStack with Razor and Chef
Bare Metal to OpenStack with Razor and ChefBare Metal to OpenStack with Razor and Chef
Bare Metal to OpenStack with Razor and Chef
 
Harmonia open iris_basic_v0.1
Harmonia open iris_basic_v0.1Harmonia open iris_basic_v0.1
Harmonia open iris_basic_v0.1
 
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법
 

Recently uploaded

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Recently uploaded (20)

Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 

OpenStack API's and WSGI

  • 1. OpenStack API's and WSGI http://github.com/lhrc-mikeyp/Presentations Mike Pittaro La Honda Research Center mikeyp@LaHondaResearch.org @pmikeyp This work is licensed under the Creative Commons Attribution- NonCommercial-ShareAlike 3.0 Unported License.
  • 2. Introduction ● Taking a peek under the hood of OpenStack ● From the API inwards ● Prerequisites ● A basic understanding of Web, REST, and HTTP ● Some knowledge of Python ● Why learn this ? ● Understand OpenStack's API implementation ● Easier to understand and troubleshoot ● First step to modifying OpenStack ● First step to extending API's
  • 3. How Deep is a 'peek' ? ● Everything should be made as simple as possible, but not simpler. ● Albert Enistein ● Simple is Better than Complex ● Complex is better than Complicated ● PEP 20
  • 4. What is OpenStack ? ● OpenStack is a global collaboration of developers and cloud computing technologists producing the ubiquitous open source cloud computing platform for public and private clouds. ● The project aims to deliver solutions for all types of clouds by being simple to implement, massively scalable, and feature rich. ● The technology consists of a series of interrelated projects delivering various components for a cloud infrastructure solution.
  • 5. How is OpenStack Implemented? ● OpenStack is a collection of services ● Compute (Nova) ● Identity (Keystone) ● Object Storage (Swift) ● Dashboard (Horizon) ● Image Service (Glance) ● Each service is a 'WebApp' ● REST API server ('frontend') ● One or more backend servers ● Messaging interface between them
  • 6. OpenStack API's ● All Interaction with OpenStack is via API's ● http://docs.openstack.org/api/ ● http://api.openstack.org/ ● API QuickStart ● http://docs.openstack.org/api/quick-start/content/ ● The API's use HTTP + json (or xml) ● Use curl or wget or browser plugins ● Use any programming language via HTTP libraries ● Use the Python novaclient library
  • 7. OpenStack In Action ● OpenStack includes a nova command ● It's built using the novaclient library mikeyp@blade1:devstack$ nova --username admin --password devstack image-list +--------------------------------------+--------------------------------------------+--------+--------+ | ID | Name | Status | Server | +--------------------------------------+--------------------------------------------+--------+--------+ | 43bafe10-700c-45af-90a8-b5d794812e62 | cirros-0.3.0-x86_64-blank-ramdisk | ACTIVE | | | 45ad4046-9780-4968-83c6-460f168321c7 | cirros-0.3.0-x86_64-blank-kernel | ACTIVE | | | 6216fc7c-7f87-45e0-be0f-eefef2d5be33 | ttylinux-uec-amd64-11.2_2.6.35-15_1 | ACTIVE | | | 92a1e0bd-c4a5-4f3f-a66f-1f8b990f2b0e | ttylinux-uec-amd64-11.2_2.6.35-15_1-kernel | ACTIVE | | | 95d8db11-b175-43d2-b3de-d7b806e54dde | cirros-0.3.0-x86_64-blank | ACTIVE | | | e543bb77-5a7d-4ef0-9a7a-92ca6c8a0b35 | cirros-0.3.0-x86_64-rootfs | ACTIVE | | +--------------------------------------+--------------------------------------------+--------+--------+ mikeyp@blade1:devstack$ nova flavor-list +----+-----------+-----------+------+-----------+------+-------+-------------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | +----+-----------+-----------+------+-----------+------+-------+-------------+ | 1 | m1.tiny | 512 | 0 | 0 | | 1 | 1.0 | | 2 | m1.small | 2048 | 10 | 20 | | 1 | 1.0 | | 3 | m1.medium | 4096 | 10 | 40 | | 2 | 1.0 | | 4 | m1.large | 8192 | 10 | 80 | | 4 | 1.0 | | 5 | m1.xlarge | 16384 | 10 | 160 | | 8 | 1.0 | +----+-----------+-----------+------+-----------+------+-------+-------------+
  • 8. Using novaclient #!/usr/bin/env python import logging import novaclient from novaclient.v1_1 import client # enable debug logging logger = logging.getLogger('novaclient.client') logger.setLevel(logging.DEBUG) debug_stream = logging.StreamHandler() logger.addHandler(debug_stream) auth_url = 'http://10.100.20.22:5000/v2.0' user = 'admin' password = 'devstack' project = 'demo' region = 'RegionOne' service = 'compute' nova = client.Client(user, password, project, auth_url, region_name=region, service_type=service) results = nova.images.list(detailed=True) for image in results: print image.id, image.name, image.status mikeyp@blade1:api_examples$ python image_list.py e543bb77-5a7d-4ef0-9a7a-92ca6c8a0b35 cirros-0.3.0-x86_64-rootfs ACTIVE 95d8db11-b175-43d2-b3de-d7b806e54dde cirros-0.3.0-x86_64-blank ACTIVE 45ad4046-9780-4968-83c6-460f168321c7 cirros-0.3.0-x86_64-blank-kernel ACTIVE 43bafe10-700c-45af-90a8-b5d794812e62 cirros-0.3.0-x86_64-blank-ramdisk ACTIVE 92a1e0bd-c4a5-4f3f-a66f-1f8b990f2b0e ttylinux-uec-amd64-11.2_2.6.35-15_1-kernel ACTIVE 6216fc7c-7f87-45e0-be0f-eefef2d5be33 ttylinux-uec-amd64-11.2_2.6.35-15_1 ACTIVE
  • 9. Keystone API using urllib2 def get_keystone_token(): """authenticate against keystone identity service returns an auth token, and the service url """ user = 'admin' password = 'devstack' project = 'demo' auth_url = 'http://10.100.20.22:5000/v2.0/tokens' auth_request = urllib2.Request(auth_url) auth_request.add_header('Content-Type', 'application/json;charset=utf8') auth_request.add_header('Accept', 'application/json') auth_request.add_header('User-Agent', 'python-mikeyp') auth_data = {"auth": {"tenantName": project, "passwordCredentials": { "username": user, "password": password} } } auth_request.add_data(json.dumps(auth_data)) auth_response = urllib2.urlopen(auth_request) response_data = json.loads(auth_response.read()) token = response_data['access']['token']['id'] service_list = response_data['access']['serviceCatalog'] for s in service_list: if s['type'] == 'compute' and s['name'] == "'Compute Service'": break nova_url = s['endpoints'][0]['publicURL'] return (token, nova_url)
  • 10. Images API using urllib2 #!/usr/bin/env python import urllib2 import json # def get_keystone_token(): # see previous page token, service_url = get_keystone_token() image_api = service_url + '/images/detail' images_request = urllib2.Request(image_api) images_request.add_header('Content-Type', 'application/json;charset=utf8') images_request.add_header('Accept', 'application/json') images_request.add_header('User-Agent', 'python-mikeyp') images_request.add_header('X-Auth-Token', token) images_request.add_header('X-Auth-Project-Id', 'demo') image_response = urllib2.urlopen(images_request) image_data = json.loads(image_response.read()) print json.dumps(image_data, indent=4)
  • 12. OpenStack 'Web Stack' ● Paste HTTP Server ● HTTP protocol + networking ● WebOb requests and responses ● Wrappers for HTTP Requests and Responses ● OpenStack code ● Nova, glance, keystone, etc ● Web Service Gateway Interface (WSGI) ● The specification for web servers and applications ● WSGI is not code – no import
  • 13. WSGI In a Nutshell ● WSGI Application ● A Python callable passed two arguments: – WSGI Environment – A start_response function ● Application calls start_response, and returns response ● WSGI Server ● The Server calls the application ● WSGI Middleware ● Both a server and application ● Use to 'wrap' or 'pipeline' requests
  • 14. Simple WSGI Application """Hello World using Paste + WSGI """ from paste import httpserver def application(environ, start_response): start_response('200 OK', [('Content-type', 'text/html')]) return ['Hello World'] httpserver.serve(application, host='127.0.0.1', port=8080)
  • 15. WSGI With WebOb + Paste wsgi_webob.py """Hello World using WebOb, Paste + WSGI """ from webob import Response from webob.dec import wsgify from paste import httpserver from paste.deploy import loadapp INI_PATH = '/home/mikeyp/Documents/Projects/OpenStack/presentations/api_examples/wsgi_webob.ini' @wsgify def application(request): return Response('Hello, World of WebOb !') def app_factory(global_config, **local_config): return application wsgi_app = loadapp('config:' + INI_PATH) httpserver.serve(wsgi_app, host='127.0.0.1', port=8080) wsgi_webob_ini.py [app:main] paste.app_factory = wsgi_webob:app_factory
  • 16. WSGI middleware """Hello World (authorized version) using WebOb, Paste + WSGI """ from webob import Response from webob.dec import wsgify from webob import exc from paste import httpserver from paste.deploy import loadapp INI_PATH = '/home/mikeyp/Documents/Projects/OpenStack/presentations/api_examples/wsgi_webob_mid.ini' @wsgify def application(request): return Response('Hello, Secret World of WebOb !') @wsgify.middleware def auth_filter(request, app): if request.headers.get('X-Auth-Token') != 'open-sesame': return exc.HTTPForbidden() return app(request) def app_factory(global_config, **local_config): return application def filter_factory(global_config, **local_config): return auth_filter wsgi_app = loadapp('config:' + INI_PATH) httpserver.serve(wsgi_app, host='127.0.0.1', port=8080)
  • 17. Paste Middleware Config [pipeline:main] pipeline = auth hello [app:hello] paste.app_factory = wsgi_webob_mid:app_factory [filter:auth] paste.filter_factory = wsgi_webob_mid:filter_factory
  • 18. Glance API Server – the code ● Paste Config file ● etc/glance-api-config.py ● Glance API server startup ● glance/common/wsgi.py ● glance/api/v1/router.py ● Main glance api files ● glance/api/v1/images.py
  • 19. Keystone middleware ● Authentication Token Verification ● keystone/middleware/auth_token.py ● WSGI middleware ● Contains filter factory
  • 20. Details and Complexity ● Lots more to learn – but not tonight ● Pluggable OpenStack API Extensions ● Front ends and load balancing ● Threading and concurrency ● URL mapping and dispatch
  • 21. References ● OpenStack ● http://www.openstack.org ● WSGI ● http://www.wsgi.org ● Paste Web Server ● http://pythonpaste.org/ ● WebOb ● http://www.webob.org/ ● P3333 (WSGI) ● http://www.python.org/dev/peps/pep-3333/ ● HTTP RFC 2616 ● http://www.ietf.org/rfc/rfc2616.txt ● RESTful Web Services (Book) ● http://shop.oreilly.com/product/9780596529260.do