Skip to main content
Skip table of contents

Skyatlas API v1

Instance operations can be performed with the SkyAtlas admin interface. Skyatlas API can provide:

  • Automating the infrastructure completely,

  • Server on-off operations,

  • Block storage or managing entire network services with the application.

 

All operations that can be done from SkyAtlas admin interface can be done with SkyAtlas API. It is necessary to complete certain steps to open an instance. There is no need to repeat all the steps to open 20 instances instead of 1 with the same features. In such cases, transactions are automated using API. The source published by OpenStack is used for the API.

Basic instance operations that can be done with SkyAtlas API:

  • Creating an instance,

  • Detailed list of instances,

  • Removing an instance,

  • Updating the instance,

  • Instance reboot.

Actions that can be done with HTTP Requests

 

This document includes the operations that can be done in the API with HTTP requests. The steps that can be done to use the API are as follows. To use these codes;

 

  • requests

  • json

  • os

  • time

 

libraries are installed and should be included in the code. Do not forget to install these libraries, then continue. After installing the necessary libraries, you must have various permissions.

 

To be logged in:

 

In order for the user to use the features on Openstack, she/he must login with the access information transmitted by SkyAtlas. The user must use his/her username, password and tenant ID information to access his/her account via the API.

 

 

Code Block ‖ Language = py

 

CODE
credentials = {"auth": {
    "passwordCredentials":{
        "username":"<email>",
        "password":"<password>"
    },
    "tenantId":"<tenant_id>"
}
}
response = requests.post("http://185.48.212.8:5000/v2.0/tokens", data=json.dumps(credentials), headers={"content-type":"application/json"})
response_dict = response.json()
token_id = response_dict["access"]["token"]["id"]

After login you will be able to run API codes. Now we can work creating instances. We cant access to instance via Internet when we first created. These are steps that should followed:

  • Creating Network

  • Creating Subnet

  • Creating Router

  • Adding Interface

  • Creating Security Rules

  • Create&Add Key Pair

  • Creating Port

  • Adding Public IP

  • Creating Images

  • Creating Flavor

  • Creating Instance

  • Assigning Public IP to Instance

Creation Process

Creating Network:

To start an instance (server) and connect, we must first create a network. With the created network, more than one instance will be able to communicate over this network. The following commands should be used to create a network: When creating a network name, use a name that does not contain unicode and Turkish characters.

 

CODE

network_dict = {
    "network": {
        "name": "<network_name>",
        "admin_state_up": True
    }
}
network_response=requests.post("http://185.48.212.8:9696/v2.0/networks",
                      headers = {"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(network_dict))

After creating the network, we can proceed to the subnet creation step.

Creating Subnet:

The following commands should be used to create subnet. We use the network id we created when creating subnet.

CODE

subnet_dict = {
    "subnet": {
        "network_id": network_id,
        "name": "<subnet_name>",
        "ip_version": 4,
        "cidr": "10.0.0.1/24",
        "gateway_ip": "10.0.0.1"
    }
}
subnet_response=requests.post("http://185.48.212.8:9696/v2.0/subnets",
                              headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(subnet_dict))

After creating a subnet, we can proceed to the router creation step.

Creating Router:

A router is needed for instances in different networks to exchange information with each other. The following commands should be used to create a router: It should be noted that an external network id should be given to the network id.

CODE
router_dict = {
    "router": {
        "name": "<router_name",
        "external_gateway_info": {
            "network_id": external_network_id
        },
        "admin_state_up": True
    }
}
router_response=requests.post("http://185.48.212.8:9696/v2.0/routers",
                       headers = {"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(router_dict))

After creating the router, you can proceed to the interface creation step.

Creating Interface:

The following commands should be used to create the interface: We use the id of the subnet we created above to create an interface.

CODE
interface_dict = {
    "subnet_id": subnet_id
}
interface_response = requests.put("http://185.48.212.8:9696/v2.0/routers/"+router_id+"/add_router_interface",
                        headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(interface_dict))

To access and connect to the Instance to be created, the security group creation process must be done before the Instance is created.

Creating Security Group:

The following commands should be used to create a security group:

CODE
security_group_response=requests.get("http://185.48.212.8:9696/v2.0/security-groups",
                      headers={"x-auth-token": token_id, "content-type":"application/json"})

From which ports the servers are required to be allowed access, they can be added under this group.

Adding Rule:

We can add rules that will enable the instance to access inward and outward. For example, we need to add the SSH rule to access linux instances via SSH via port 22.

CODE
rules_dict = {
    "security_group_rule": {
        "direction": "ingress",
        "port_range_min": "22",
        "ethertype": "IPv4",
        "port_range_max": "22",
        "protocol": "tcp",
        "security_group_id": security_group_id
    }
}
 
rules_response=requests.post("http://185.48.212.8:9696/v2.0/security-group-rules",
                      headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(rules_dict))

Adding Keypair:

Keypair must be added for secure connection to Linux servers. In order to add a keypair, a public key must first be created from the local system. This public key is given to the public key parameter. While creating a Keypair name, it is important to use names that do not contain unicode and Turkish characters without leaving spaces.

CODE
home_directory = os.getenv("HOME")
key = open(home_directory + "/.ssh/id_rsa.pub")
public_key = key.read()
 
keypair_dict = {
    "keypair": {
        "name": "<keypair_name>",
        "public_key": public_key
    }
}
keypair_response=requests.post("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/os-keypairs",
                      headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(keypair_dict))

The keypair we have created will be used to connect to a server with a public IP via ssh.

Creating Port:

CODE
port_dict = {
    "port": {
        "network_id": network_id,
        "name": "<port_name>",
        "admin_state_up": True
    }
}
port_response=requests.post("http://185.48.212.8:9696/v2.0/ports",
                            headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(port_dict))

Creating Public IP:

We need to create a public ip to access the instance to be created over the internet. The following commands should be used to create a public ip:

CODE
floating_dict = {
    "floatingip": {
        "floating_network_id": external_network_id,
        "port_id": port_id
    }
}
floating_response=requests.post("http://185.48.212.8:9696/v2.0/floatingips",
                                headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(floating_dict))

Creating Images:

We choose which operating system the server will use by creating images. We created Ubuntu here. CentOS, Debian, Fedora and Windows can also be used as required.

CODE
images_response = requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/images",
                               headers={"x-auth-token": token_id})
images = images_response.json()["images"]
 
for image in images:
    if image["name"] ==  "Ubuntu Trusty":
        image_id = image["id"]

Creating Flavor:

While creating a flavor, we determine the size of the server we will open. We can create servers in sizes S, M, L, XL and XXL.

CODE
flavor_response = requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/flavors",
                               headers = {"x-auth-token": token_id})
 
flavors = flavor_response.json()["flavors"]
for flavor in flavors:
    if flavor["name"] == "General S":
        flavor_id = flavor["id"]

Creating Server:

To create a server, a server name, image id, flavor id, keypair name and network id parameters should be given as shown below.

CODE
server_info = {
    "server": {
        "name":"<server_name>",
      "imageRef": image_id,
      "flavorRef": flavor_id,
        "key_name": "<keypair_name>",
        "networks": [
            {
                "uuid": network_id
            }
        ]
    }
}
 
compute_response = requests.post("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers",
                                 headers = {"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(server_info))

Adding Public IP to Instance:

In order to access a server over the internet, any ip address parameter that has previously added floating strings is given.

CODE
floating_ip_dict = {
    "addFloatingIp": {
        "address": floating_ip
    }
}
 
 
response=requests.post("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers/"+server_id+"/action",
                      headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(floating_ip_dict))

With these steps, we created a server that can be connected via SSH.

Building an Externally Accessible Server from Scratch:

You can perform the steps we separated in the previous title with a single code in this section.

CODE
import requests
import json
import os
import time

credentials = {"auth": {
    "passwordCredentials":{
        "username":"<email>",
        "password":"<password>"
    },
    "tenantId":"<tenant_id>"
}
}
response = requests.post("http://185.48.212.8:5000/v2.0/tokens", data=json.dumps(credentials), headers={"content-type":"application/json"})
response_dict = response.json()
token_id = response_dict["access"]["token"]["id"]
network_dict = {
    "network": {
        "name": "<network_name>",
        "admin_state_up": True
    }
}
print "Creating Network"
network_response=requests.post("http://185.48.212.8:9696/v2.0/networks",
                      headers = {"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(network_dict))

network_id = network_response.json()["network"]["id"]

subnet_dict = {
    "subnet": {
        "network_id": network_id,
        "name": "<subnet_name>",
        "ip_version": 4,
        "cidr": "10.0.0.1/24",
        "gateway_ip": "10.0.0.1"
    }
}
print "Creating Subnet"
subnet_response=requests.post("http://185.48.212.8:9696/v2.0/subnets",
                              headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(subnet_dict))

subnet_id = subnet_response.json()["subnet"]["id"]

list_network_response=requests.get("http://185.48.212.8:9696/v2.0/networks",
                      headers={"x-auth-token": token_id, "content-type":"application/json"})
networks = list_network_response.json()["networks"]
for network in networks:
    if network["router:external"]:
        external_network_id = network["id"]

router_dict = {
    "router": {
        "name": "<router_name",
        "external_gateway_info": {
            "network_id": external_network_id
        },
        "admin_state_up": True
    }
}

print "Creating Router"
router_response=requests.post("http://185.48.212.8:9696/v2.0/routers",
                       headers = {"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(router_dict))

router_id = router_response.json()["router"]["id"]

interface_dict = {
    "subnet_id": subnet_id
}
print "Creating Interface"
interface_response = requests.put("http://185.48.212.8:9696/v2.0/routers/"+router_id+"/add_router_interface",
                        headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(interface_dict))
print "Creating Security Group"
security_group_response=requests.get("http://185.48.212.8:9696/v2.0/security-groups",
                      headers={"x-auth-token": token_id, "content-type":"application/json"})
security_group_id = security_group_response.json()["security_groups"][0]["id"]

rules_dict = {
    "security_group_rule": {
        "direction": "ingress",
        "port_range_min": "22",
        "ethertype": "IPv4",
        "port_range_max": "22",
        "protocol": "tcp",
        "security_group_id": security_group_id
    }
}

rules_response=requests.post("http://185.48.212.8:9696/v2.0/security-group-rules",
                      headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(rules_dict))

home_directory = os.getenv("HOME")
key = open(home_directiry + "/.ssh/id_rsa.pub")
public_key = key.read()

keypair_dict = {
    "keypair": {
        "name": "<keypair_name>",
        "public_key": public_key
    }
}
print "Creating Keypair"
keypair_response=requests.post("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/os-keypairs",
                      headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(keypair_dict))

port_dict = {
    "port": {
        "network_id": network_id,
        "name": "<port_name>",
        "admin_state_up": True
    }
}
print "Creating Port"
port_response=requests.post("http://185.48.212.8:9696/v2.0/ports",
                            headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(port_dict))
port_id = port_response.json()["port"]["id"]


floating_dict = {
    "floatingip": {
        "floating_network_id": external_network_id,
        "port_id": port_id
    }
}
floating_response=requests.post("http://185.48.212.8:9696/v2.0/floatingips",
                                headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(floating_dict))

floating_ip = floating_response.json()["floatingip"]["floating_ip_address"]

print "Creating Images"
images_response = requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/images",
                               headers={"x-auth-token": token_id})
images = images_response.json()["images"]

for image in images:
    if image["name"] ==  "Ubuntu Trusty":
        image_id = image["id"]
print "Creating Flavor"
flavor_response = requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/flavors",
                               headers = {"x-auth-token": token_id})

flavors = flavor_response.json()["flavors"]
for flavor in flavors:
    if flavor["name"] == "General S":
        flavor_id = flavor["id"]

print "Creating Server"

server_info = {
    "server": {
        "name":"<server_name>",
      "imageRef": image_id,
      "flavorRef": flavor_id,
        "key_name": "<keypair_name>",
        "networks": [
            {
                "uuid": network_id
            }
        ]
    }
}

compute_response = requests.post("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers",
                                 headers = {"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(server_info))
server_id = compute_response.json()["server"]["id"]
server_ready = False
while not server_ready:
    time.sleep(5)
    print "Waiting for Server Ready"
    compute_detail_response = requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers/"+server_id,
                                 headers = {"x-auth-token": token_id})
    status = compute_detail_response.json()["server"]["status"]
    server_ready = (status == "ACTIVE")


print "Creating Floating Ip"

floating_ip_dict = {
    "addFloatingIp": {
        "address": floating_ip
    }
}


response=requests.post("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers/"+server_id+"/action",
                      headers={"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(floating_ip_dict))

Deletion Operations

The following command lines are run to delete the existing routers, networks and servers.

CODE
import requests
import json
import pprint

credentials = {"auth": {
    "passwordCredentials":{
        "username":"<email>",
         "password":"<password>"
      },
      "tenantId":"<tenant_id>"
      }

}
response = requests.post("http://185.48.212.8:5000/v2.0/tokens", data=json.dumps(credentials),
                         headers = {"content-type":"application/json"})
response_dict = response.json()
token_id = response_dict["access"]["token"]["id"]

response_floatingIp_list = requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/os-floating-ips",
                                             headers = {"x-auth-token": token_id})
for i in response_floatingIp_list.json()["floating_ips"]:
    deallocate_floatingIp = requests.delete("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/os-floating-ips/"+i["id"],
                                             headers = {"x-auth-token": token_id, "content-type":"application/json"})

response_port_list = requests.get("http://185.48.212.8:9696/v2.0/ports",
                                  headers={"x-auth-token": token_id})
response_ports = response_port_list.json()["ports"]
response_router_list = requests.get("http://185.48.212.8:9696/v2.0/routers",
                                    headers = {"x-auth-token": token_id})
for port in response_ports:
    fixed_ips = port["fixed_ips"]
    for fixed_ip in fixed_ips:
        subnet_id = fixed_ip["subnet_id"]

        interface_dict = {
            "subnet_id": subnet_id
        }
        for router in response_router_list.json()["routers"]:
            requests.put("http://185.48.212.8:9696/v2.0/routers/"+router["id"]+"/remove_router_interface",
                                                headers = {"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(interface_dict))

for i in response_router_list.json()["routers"]:
    delete_router = requests.delete("http://185.48.212.8:9696/v2.0/routers/"+i["id"],
                                    headers={"x-auth-token": token_id, "content-type":"application/json"})
for i in response_port_list.json()["ports"]:
    delete_ports = requests.delete("http://185.48.212.8:9696/v2.0/ports/"+i["id"],
                                   headers={"x-auth-token": token_id})
    pprint.pprint(delete_ports.text)

response_subnet_list = requests.get("http://185.48.212.8:9696/v2.0/subnets",
                                  headers={"x-auth-token": token_id})

for i in response_subnet_list.json()["subnets"]:
    delete_subnet = requests.delete("http://185.48.212.8:9696/v2.0/subnets/"+i["id"],
                                   headers={"x-auth-token": token_id})
    pprint.pprint(delete_subnet.text)

response_network_list = requests.get("http://185.48.212.8:9696/v2.0/networks",
                      headers={"x-auth-token": token_id})


for i in response_network_list.json()["networks"]:
    delete_network = requests.delete("http://185.48.212.8:9696/v2.0/networks/"+i["id"],headers={"x-auth-token": token_id} )
    pprint.pprint(delete_network.text)


response_list_servers=requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers",
                      headers = {"x-auth-token": token_id})
for i in response_list_servers.json()["servers"]:
    delete_servers = requests.delete("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers/"+i["id"],
                                     headers={"x-auth-token": token_id})

Deleting a Server:

CODE
compute_response = requests.delete("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers/<"sunucu_id>",
                                   headers={"x-auth-token": token_id, "content-type":"application/json"})

Listing Operations

Image Listing:

CODE
images_response = requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/images",
	headers={"x-auth-token": token_id})

Detailed Listing of Desired Server:

CODE
response=requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers/<server_id>", 
	headers = {"x-auth-token": token_id}) 

Keypair Listing:

CODE
response=requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/os-keypairs",
	headers = {"x-auth-token": token_id, "content-type":"application/json"})

Flavor Listing:

CODE
flavor_response = requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/flavors",
	headers={"x-auth-token": token_id})

Network Listing:

CODE
response=requests.get("http://185.48.212.8:9696/v2.0/networks",
	headers = {"x-auth-token": token_id, "content-type":"application/json"})

Port Listing:

CODE
response_port_list = requests.get("http://185.48.212.8:9696/v2.0/ports",
    headers={"x-auth-token": token_id, "content-type":"application/json"})

Security Group Listing:

 

CODE
response=requests.get("http://185.48.212.8:9696/v2.0/security-groups",
    headers = {"x-auth-token": token_id, "content-type":"application/json"})

Listing Servers:

CODE
response=requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/6<tenant_id>/servers", 
	headers = {"x-auth-token": token_id})

Listing Rules:

CODE
response=requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/6<tenant_id>/os-security-groups-default-rules",
    headers = {"x-auth-token": token_id, "content-type":"application/json"})

Listing Details of Servers:

CODE
response = requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers/detail",
                      headers={"x-auth-token": token_id}) 

pprint.pprint(response.json()) 

Listing Details of the Desired Server:

CODE
response=requests.get("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers/<server_id>", 
	headers = {"x-auth-token": token_id}) 

Update Procedures

Instance Update:

CODE
servers = {
    "server": {
        "name": "<yeni_isim>"
    }
}

response=requests.put("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers/<server_id>", 
                 headers={"content-type":"application/json","x-auth-token": token_id}, data=json.dumps(servers))

Password Update:

CODE
server_info = {
    "changePassword": {
        "adminPass": "<new_password>"
    }
}

compute_response = requests.post("https://compute.istanbul-1.endpoint.skyatlas.com/v2/6a97dceaa064484eb2be90867684bf7b/servers/ba4fb7c8-5625-4820-aaf7-f6a01a72bb28/action", headers = {"x-auth-token": token_id, "content-type":"application/json"}, data=json.dumps(server_info))

Reboot Server:

CODE
servers = {
    "reboot": {
        "type": "SOFT"
    }
}
response=requests.post("https://compute.istanbul-1.endpoint.skyatlas.com/v2/<tenant_id>/servers/<server_id>/action", 
	headers = {"content-type":"application/json","x-auth-token": token_id}, data=json.dumps(servers)) 

Basic Server Operations with Python Novaclient

Creating a Server:

CODE
from keystoneclient.auth.identity import v2
from keystoneclient import session
from novaclient.v2 import client
auth = v2.Password(auth_url="http://185.48.212.8:5000/v2.0",
                   username="<email>",
                   password="<password>",
                   tenant_id="<tenant_id>")
sess = session.Session(auth=auth)
nova = client.Client("http://185.48.212.8:5000/v2.0", session=sess)

fl = nova.flavors.find(ram=2048)
img = nova.images.find(name="Ubuntu Trusty")
nova.servers.create("my-server", flavor=fl, image=img)

Server Listing:

CODE
from keystoneclient.auth.identity import v2
from keystoneclient import session
from novaclient.v2 import client
auth = v2.Password(auth_url="http://185.48.212.8:5000/v2.0",
                   username="<email>",
                   password="<password>",
                   tenant_id="<tenant_id>")
sess = session.Session(auth=auth)
nova = client.Client("http://185.48.212.8:5000/v2.0", session=sess)
for i in nova.servers.list(detailed=True) :
    print i.id, i.name, i.status

Server Update:

CODE
from keystoneclient.auth.identity import v2
from keystoneclient import session
from novaclient.v2 import client
auth = v2.Password(auth_url="http://185.48.212.8:5000/v2.0",
                   username="<email>",
                   password="<password>",
                   tenant_id="<tenant_id>")
sess = session.Session(auth=auth)
nova = client.Client("http://185.48.212.8:5000/v2.0", session=sess)
server = nova.servers.find(name="<eski_isim>")

server.update(name="<yeni_isim>")

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.