Code Monkey home page Code Monkey logo

python-otcclient's Introduction

⛔ [DEPRECATED] OTCclient

PyPI version

Open Telecom Cloud API tool

#OTC #cloud #devops #IAAS #PAAS #DBAAS #BDAAS #container-services

The purpose of the OTC Tool is to manage OTC cloud environments via the command line similar in a way to AWS CLI. OTC CLI provides a common interface to operation and DEVOPS teams to manage their cloud services. On top of that, the language implementations (Python at the moment) are secure and relatively fast.

More at OTC site

OTC makes it easy to use the cloud environment. It exposes Native OpenStack APIs which are enhanced with extra services and APIs from Huawei FusionSphere.

deprecated / obsolete

Documentation

Otcclient Reference

Command line usage

$ sudo pip install python-otcclient

or

$ git clone https://github.com/OpenTelekomCloud/python-otcclient.git

Usage

OTC Tool Configuration Commands:
otc configure                                                        Configuring OTC client tool (mandatory in first use)
otc configure-proxy                                                  Configureing proxy settings ( ONLY https )
otc version                                                          Print OTC Client tool version
S3 Commands:
otc s3 ls                                                            List Buckets
otc s3 ls mybucket                                                   List Bucket files
otc s3 mb mybucket                                                   Create New Bucket
otc s3 cp s3://bucketname/filename.txt /localdir/filename.txt        Download from bucket to local
otc s3 cp /localdir/filename.txt s3://bucketname/filename.txt        Upload file / directory to bucket
ECS Flavor & Image Commands:
otc ecs describe-flavors                                             List avaliable flavors (VM templates)
otc ecs describe-images                                              List image templates
VPC Commands:
otc ecs create-vpc --vpc-name myvpc --cidr 10.0.0.0/8                Crete new VPC
otc ecs describe-vpcs                                                List VPCs
Subnet Commands:
otc ecs create-subnet --subnet-name subnettest --cidr 192.168.1.0/16 --gateway-ip 192.168.1.2 --primary-dns 8.8.8.8 --secondary-dns 8.8.4.4 --availability-zone eu-de-01 --vpc-name default-vpc    Create new subnet for VPC
otc ecs describe-subnets --output Json
Security Group Commands:
otc ecs create-security-group --group-name test2 --vpc-name default-vpc  Create new security group
otc ecs describe-security-groups                                     List existing security-groups
otc ecs authorize-security-group-ingress --group-name test2 --vpc-name default-vpc --protocol tcp --ethertype IPv4 --portmin 22 --portmax 25      Add new incomming rule to security-group
otc ecs authorize-security-group-egress --group-name test2 --vpc-name default-vpc --protocol tcp --ethertype IPv4 --portmin 7000 --portmax 7001   Add new outcomming rule to security-group
Keypair Commands:
otc ecs describe-key-pairs                                           List key pairs
otc ecs create-key-pair --key-name mykeypair --public-key "ssh-rsa AA..."       Create key pair
Instance Commands:
otc ecs describe-instances                                           List VM instances
otc ecs describe-instances  --instance-ids 097da903-ab95-44f3-bb5d-5fc08dfb6cc3 --output Json     Detailed information of specific VM instance (JSON)
otc ecs run-instances --count 1  --admin-pass yourpass123! --instance-type c1.medium --instance-name instancename --image-name Standard_CentOS_6.7_latest --subnet-name testsubnet --vpc-name testvpc --group-name testsecgroup     Create new VM instance and START
otc ecs run-instances --count 1  --admin-pass yourpass123! --instance-type c1.medium --instance-name instancename --image-name Standard_CentOS_6.7_latest --subnet-name testsubnet --vpc-name testvpc --group-name testsecgroup  --key-name testsshkeypair --file1 /otc/a=/otc/a
--associate-public-ip-address  --wait-instance-running    Create new VM instance with injected SSH keypair, with public ip, additional file injection, wait instance created and running
otc ecs describe-instances                                           List VM instances
otc ecs stop-instances   --instance-ids b6c602b1-06d0-4bdb-b764-5d43b47abc14        Stop VM instance
otc ecs start-instances  --instance-ids b6c602b1-06d0-4bdb-b764-5d43b47abc14        Start VM instance
otc ecs reboot-instances --instance-ids b6c602b1-06d0-4bdb-b764-5d43b47abc14        Reboot VM instance
otc ecs delete-instances --instance-ids b6c602b1-06d0-4bdb-b764-5d43b47abc14        Delete VM instance (public ip + EVS also)
Backup Commands:
otc ecs create-snapshot  --volume-id b197b8af-fe63-465f-97b6-5e5b89exxxx  Create snapshot of volume
otc ecs describe-snapshots                                           List backup volumes
otc ecs delete-snapshot  --snapshot-id 0c942ff7-454e-xxxx            Delete volume backup
Volume Commands:
otc ecs describe-volumes                                             List volumes
otc ecs create-volume   --volume-id b197b8af-fe63-465f-97b6-5e5b89exxx --snapshot-id 0c942ff7-454e-xxxx Create volume from snapshot
otc ecs create-volume   --count 1 --volume-name myvolume  --size 100 --volume-type SATA      Create new Volume [type: SSD,SAS,SATA]
otc ecs attach-volume   --instance-ids f344b625-6f73-44f8-ad56-9fcb05a523c4 --volume-id 8c0de9a7-9f61-4613-a68a-21f456cb7298             Attach volume to instance
otc ecs detach-volume   --instance-ids f344b625-6f73-44f8-ad56-9fcb05a523c4 --volume-id 8c0de9a7-9f61-4613-a68a-21f456cb7298             Detach volume from instance
otc ecs delete-volume   --volume-id 8c0de9a7-9f61-4613-a68a-21f456cb7298                                                                 Delete volume
Public Ip Commands:
otc otc ecs describe-addresses                                       List public ip adresses
otc ecs allocate-address                                             Allocate public ip address from public ip pool
otc ecs associate-address --public-ip 46.29.96.246 --network-interface-id b197b8af-fe63-465f-97b6-5e5b89exxx      Assodicate public ip with Network Interface Id

Writing clients

Example Client with JSON output

#!/usr/bin/env python

import sys
import os

from otcclient.core.userconfigaction import userconfigaction
from otcclient.core.configloader import configloader
from otcclient.core.OtcConfig import OtcConfig
from otcclient.plugins.ecs.ecs import ecs

if __name__ == '__main__':
    configloader.readUserValues() 
    configloader.readProxyValues()

    OtcConfig.OUTPUT_FORMAT = "Json"

    ecs.getIamToken()
    ecs.describe_vpcs()

Example Ansible Module

  • Ansible modules should not print everything to STDOUT (noout plugin)
  • Returned results are strings and need to bo converted back into data (json.loads())
	#!/usr/bin/python
	
	import os
	import sys
	import re
	import json
	
	from ansible.module_utils.basic import *
	
	from otcclient.core.userconfigaction import userconfigaction
	from otcclient.core.configloader import configloader
	from otcclient.core.OtcConfig import OtcConfig
	from otcclient.plugins.ecs import ecs
	
	# DOCUMENTATION = """
	# ---
	# module: otc_vpc
	# short_description: manage otc vpcs aka tenants
	# description:
	# - create or a delete an otc vpc
	# options:
	#   name:
	#   - description: Name of VPC
	#   cidr:
	#   - description: Net for VPC in CIDR format
	#   state:
	#   - description: absent or present
	# author: Matthias Witte <[email protected]>
	# """
	
	def _otc_init():
	    configloader.readUserValues()
	    configloader.readProxyValues()
	
	    OtcConfig.OUTPUT_FORMAT = "noout"
	    if OtcConfig.TOKEN == "":
	        ecs.getIamToken()
	
	def _get_vpcs():
	    try:
	        vpcs = json.loads(ecs.describe_vpcs())['vpcs']
	    except:
	        module.fail_json(msg="Result has no key 'vpcs'")
	    return vpcs
	
	
	def _vpc_create(module):
	    OtcConfig.VPCNAME = module.params['name']
	    OtcConfig.VPC_CIDR = module.params['cidr']
	    ecs.create_vpc()
	
	def _vpc_delete(module):
	    OtcConfig.VPCNAME = module.params['name']
	    module.fail_json(msg="Not implemented in OTC API.")
	    ecs.delete_vpc()
	
	def main():
	    module = AnsibleModule(
	        argument_spec = dict(
	            name    = dict(required=True),
	            cidr    = dict(required=False),
	            state   = dict(default='present', choices=['absent', 'present']),
	         )
	    )
	
	    if module.params['state'] == 'present' and 'cidr' not in module.params:
	        module.fail_json(msg="Missing argument 'cidr'")
	
	    _otc_init()
	
	    vpc_changed = False
	    vpc = [vpc for vpc in _get_vpcs() if vpc['name'] == module.params['name']]
	    if len(vpc) == 0:
	        if module.params['state'] == 'present':
	            _vpc_create(module)
	            vpc_changed = True
	    elif len(vpc) == 1:
	        if module.params['state'] == 'absent':
	            _vpc_delete(module)
	            vpc_changed = True
	    else:
	        module.fail_json(msg="Tenant name not unique.")
	
	    module.exit_json(changed=vpc_changed)
	
	if __name__ == '__main__':
	    main()

License

The MIT License (MIT)

Copyright (c) 2016 OpenTelekomCloud

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

python-otcclient's People

Contributors

28formica77 avatar eumel8 avatar garloff avatar gtema avatar hajoeichler avatar hodigy avatar kamilstas avatar klette-farmnet avatar mattbarrio avatar nils-magnus avatar rkuzma avatar spielkind avatar tejado avatar tholor avatar zamiam69 avatar zsoltn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

python-otcclient's Issues

the ansible module sample does not work

when i try to run the ansible module sample to create a vpc, i get the following error:

The error was: AttributeError: 'module' object has no attribute 'getIamToken'

RDS - HA Deployment

Hi guys,

when I create an HA rds cluster both instances, master and slave, are being created in the same availability zone.
When I'm using the rds wizard, I'm able to choose the primary AZ and the secondary AZ, but this does not reflect directly to the API?!

Can you please support me?

Thanks,
Robert

use of private images

If I use a private image (e.g. "open-telekom-cloud_com") then I get this error message:

Image definition not Correct ! Check images:
otc ecs describe-images

(this command doesn't show my private image shown by web interface)

Provide RDS example, fix RDS plugin

Fix RDS plugin to support pgsql,mysql,mssql
Create client full example script using python-otcclient with following feature:
+Cluster creation
+deploy wordpress image via bitnami and integrate with RDS mysql
+provide simple example code (nodejs or python) using RDS ( pgsql, mysql, wordpress ) from ECS vm

Issue creating ingress/egress rules

ISSUE

When creating a security group and then adding an ingress/egress rule with a VPC and group-names flag set it fails

STEPS TO REPRODUCE

When creating a security group via the following command: otc ecs create-security-group --group-names ${ENV_NAME}-secgroup --vpc-name ${ENV_NAME}-vpc

openstack security group list
| ID | Name | Description | Project |
| 04ea89d2-caa4-4007-a811-bcdcca6c45f3 | ol-staging-secgroup | | |

It does not set the VPC correctly. This causes adding a security group rule with the VPC and group-names flags set to fail as this check does not return any security group id from convertSECUGROUPNameToId()

root@09fcbc9483fe:/src# otc ecs authorize-security-group-ingress --group-names ${ENV_NAME}-secgroup --vpc-name ${ENV_NAME}-vpc --protocol tcp --ethertype IPv4 --portmin 22 --portmax 22 --cidr 0.0.0.0/0
otc: TypeError("cannot concatenate 'str' and 'NoneType' objects",) for help use --help

After updating the description with the VPC id and running the same command it is successful in adding the security rule.

I believe this stems from the following change: #41
Possible that the os-security-group endpoint is not handling the vpc correctly when creating the group.

Make py3 compatible

λ otc configure 
Traceback (most recent call last):
  File "/usr/local/bin/otc", line 7, in <module>
    from otcclient.shell import main
  File "/usr/local/lib/python3.6/dist-packages/otcclient/shell.py", line 6, in <module>
    from otcclient.utils.utils_output import printShortHelp
  File "/usr/local/lib/python3.6/dist-packages/otcclient/utils/utils_output.py", line 125
    print i,j
          ^

And after fixing that:

λ otc --configure                                                                 
Traceback (most recent call last):
  File "/usr/local/bin/otc", line 11, in <module>
    load_entry_point('python-otcclient==0.3.31', 'console_scripts', 'otc')()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 561, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2631, in load_entry_point
    return ep.load()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2291, in load
    return self.resolve()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2297, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/usr/local/lib/python3.6/dist-packages/otcclient/shell.py", line 6, in <module>
    from otcclient.utils.utils_output import printShortHelp
  File "/usr/local/lib/python3.6/dist-packages/otcclient/utils/utils_output.py", line 10, in <module>
    from otcclient.core.argmanager import get_help_iter
  File "/usr/local/lib/python3.6/dist-packages/otcclient/core/argmanager.py", line 64
    print fval 

After fixing that:

λ otc --configure                                                              
Traceback (most recent call last):
  File "/usr/local/bin/otc", line 11, in <module>
    load_entry_point('python-otcclient==0.3.31', 'console_scripts', 'otc')()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 561, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2631, in load_entry_point
    return ep.load()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2291, in load
    return self.resolve()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2297, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/usr/local/lib/python3.6/dist-packages/otcclient/shell.py", line 23, in <module>
    from otcclient.core.userconfigaction import userconfigaction
  File "/usr/local/lib/python3.6/dist-packages/otcclient/core/userconfigaction.py", line 67
    print e
          ^
SyntaxError: Missing parentheses in call to 'print'

I gave up after that...

AttributeError: 'module' object has no attribute 'getIamToken'

I run, how in your exemple

#!/usr/bin/env python

import sys
import os

from otcclient.core.userconfigaction import userconfigaction
from otcclient.core.configloader import configloader
from otcclient.core.OtcConfig import OtcConfig
from otcclient.plugins.ecs import ecs

if __name__ == '__main__':
    configloader.readUserValues() 
    configloader.readProxyValues()

    OtcConfig.OUTPUT_FORMAT = "Json"

    ecs.getIamToken()
    ecs.describe_vpcs()

And get

 ecs.getIamToken()
AttributeError: 'module' object has no attribute 'getIamToken'

Provide CCE example, fix CCE plugin

  • Fix CCE plugin to support full deployment chain of internal or external container images
  • Create client full example script using python-otcclient with following feature:
    +Cluster creation
    +node add (node remove)
    +container image upload
    +image deployment using CCE (a.component and b.template also !),
    +check deployed image status

S3 upload of directory not working

Problem: The upload of a directory from local to s3 via otc s3 cp local_dir s3://some-bucket/dir --recursive True doesn't work.

Fix: Reason seems to be a small typo in utils/utils_s3.py . I will create a pull request ...

Security Groups are no longer tagged with the VPC so the convertSECUGROUPNameToId() does not return a result if the VPC is specified

The problem seems to lie with these if checks:

        if security_group.get("name") == OtcConfig.SECUGROUPNAME and ( security_group.get("vpc_id") == OtcConfig.VPCID or OtcConfig.VPCID is None ) :
            OtcConfig.SECUGROUP = security_group["id"]
        if security_group.get("name") == OtcConfig.SOURCE_GROUP and ( security_group.get("vpc_id") == OtcConfig.VPCID or OtcConfig.VPCID is None ) :
            OtcConfig.SOURCE_GROUP_ID = security_group["id"]

the second condition is not satisfied if the VPC is specified but the SG is not tagged.

( security_group.get("vpc_id") == OtcConfig.VPCID or OtcConfig.VPCID is None )

This extra check seems unnecessary?

So this command fails for new security groups but not old ones.

otc ecs run-instances --count 1 --instance-type c1.medium --instance-name TEST_VM_API --image-name Standard_openSUSE_42.1_JeOS_latest --subnet-name subnet-az1-131 --vpc-name TEST --group-names TEST --key-name TEST

with --security-group-ids, it works.

Issue with network_id returning instead of subnet id

ISSUE
When creating/describing a subnet the id that is returned is the network_id and not the id of the actual subnet.

STEPS TO REPRODUCE

  1. create subnet via otc client

root# otc ecs create-subnet --subnet-name ${ENV_NAME}-01 --cidr ${SUBNET_1_CIDR_BLOCK} --gateway-ip ${SUBNET_1_GATEWAY_IP} --primary-dns ${PRIMARY_DNS} --secondary-dns ${SECONDARY_DNS} --availability-zone eu-de-01 --vpc-name ${ENV_NAME}-vpc

>{"subnet":{"id":"4907224f-c12c-45bd-9f9a-18c99ec20a26","name":"ol-staging-01","cidr":"192.168.1.0/24","status":"UNKNOWN","vpc_id":"2c24c98d-7970-4506-b627-812c13ae8521","gateway_ip":"192.168.1.1","dhcp_enable":true,"primary_dns":"100.125.4.25","secondary_dns":"8.8.8.8","availability_zone":"eu-de-01"}}

root# otc ecs describe-subnets
>| status | name | availability_zone | primary_dns | gateway_ip | vpc_id | cidr | id | ACTIVE | ol-staging-01 | eu-de-01 | 100.125.4.25 | 192.168.1.1 | 2c24c98d-7970-4506-b627-812c13ae8521 | 192.168.1.0/24 | 4907224f-c12c-45bd-9f9a-18c99ec20a26 |

  1. Checking this via the openstack cli the correct id and network id are returned

root# openstack subnet list
>| ID | Name | Network | Subnet | | 2e580847-e14e-4f8b-bdfd-e1fde65dda97 | ol-staging-01 | 4907224f-c12c-45bd-9f9a-18c99ec20a26 | 192.168.1.0/24 |

When sending delete to the endpoint with the network id this fails, 1) because there is a port attached to the subnet (seems to be the gateway_ip?) 2) because there is no subnet with the id of network id.

Anywork around with the native openstack client or thoughts about fixes on the otc client? I tried to delete the port via openstack cli but ended with error because of the device-owner=network:dhcp and didn't want to orphan any objects by removing that.

Invalid command:'token' on "otc s3 ls" command

i just installed the python-otcclient via pip did the configuration via otc --configure but then i tried to issue the otc s3 ls command which failed with the message:

Invalid command:'token'
usage: otc [-h] [-V] [-d] [--configure [{user,proxy}]] <plugin name> <command>
Available plugin commands:
('rds', ['describe_db_instances', 'describe_datastore', 'describe_flavors'])
...```
any suggestions on how to solve this problem?

Unable to delete Subnet

running the following code fails as the REST API call to delete a subnet in OTC is missing a slash in the URL.

from otcclient.core.OtcConfig import OtcConfig
from otcclient.plugins.ecs.ecs import ecs

OtcConfig.VPCNAME = 'vpc-name'
ecs.convertVPCNameToId()
OtcConfig.SUBNETNAME = 'subnet-name'
ecs.convertSUBNETNameToId()
ecs.delete_subnet()

define fixed ips for subnets

I think adding an option to add subnets with a specific IP like it's possible in 'otc-shell' tools is would be good. But I'm unsure how the cmdline option/syntax should look like.

Currently there is --subnet-id or --subnet-name which can be comma-separated lists to define multiple subnets. So one option could be sth. like that:
--subnet-id xyzthisisanidxyz=192.168.0.1,yxzthisisanotheridxyz=192.168.1.1
--subnet-name mysubnet1=192.168.0.1,mysubnet2=192.168.1.1

But I think better would be to reformat the whole syntax with multiple --nic options like that:
--nic subnet-id=xyzthisisanidxyz,v4-fixed-ip=192.168.0.1 --nic subnet-name=mysubnet2,v4-fixed-ip=192.168.1.1

Comments? Solutions? =)

create user-configuration failed

the function getAuthKeys in userconfigaction.py does not work for me. The length of my username is 7. With password the same.

ecs.delete_vpc() fails with "Api does not exist"

Example code

#!/usr/bin/env python

import sys
import os

from otcclient.core.userconfigaction import userconfigaction
from otcclient.core.configloader import configloader
from otcclient.core.OtcConfig import OtcConfig
from otcclient.plugins.ecs import ecs

if __name__ == '__main__':
    configloader.readUserValues()
    configloader.readProxyValues()

    OtcConfig.OUTPUT_FORMAT = "Json"

    ecs.getIamToken()

    OtcConfig.VPCNAME = "bmptest2"
    OtcConfig.CIDR = "10.1.1.0/24"

    ecs.delete_vpc()

syntaxError after import

My script until now...

import sys
import os

from otcclient.core.userconfigaction import userconfigaction
from otcclient.core.OtcConfig import OtcConfig
from otcclient.plugins.ecs.ecs import ecs

I get his error in python:

Traceback (most recent call last):
  File "/home/frank/AtomProjects/OTCC/test.py", line 4, in <module>
    from otcclient.core.userconfigaction import userconfigaction
  File "/home/frank/AtomProjects/OTCC/venv/lib/python3.7/site-packages/otcclient/core/userconfigaction.py", line 8, in <module>
    from otcclient.core.configloader import configloader
  File "/home/frank/AtomProjects/OTCC/venv/lib/python3.7/site-packages/otcclient/core/configloader.py", line 18, in <module>
    from otcclient.core.pluginmanager import getplugin
  File "/home/frank/AtomProjects/OTCC/venv/lib/python3.7/site-packages/otcclient/core/pluginmanager.py", line 67, in <module>
    initPlugins()
  File "/home/frank/AtomProjects/OTCC/venv/lib/python3.7/site-packages/otcclient/core/pluginmanager.py", line 43, in initPlugins
    p = load_from_file(location)    
  File "/home/frank/AtomProjects/OTCC/venv/lib/python3.7/site-packages/otcclient/core/pluginmanager.py", line 22, in load_from_file
    py_mod = imp.load_source(mod_name, filepath)
  File "/usr/lib/python3.7/imp.py", line 171, in load_source
    module = _load(spec)
  File "/home/frank/AtomProjects/OTCC/venv/lib/python3.7/site-packages/otcclient/plugins/ecs/ecs.py", line 1382
    print url
            ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(url)?

mark inactive options

Please, mark options that are currently not active as inactive:

  • otc help should give this information
  • usage of inactive options should show - at least - a warning, that my action/option doesn't make sence

Examples: --size parameter and action version.

Absense of OS_AUTH_URL in config (env) leads to unusability

otc configure does not fill OS_AUTH_URL. Further usage (i.e. otc rds describe_db_instances) leads to "API not found", since API request with host IP (w/o hostname) is not reasonable.
It should be ensured, that OS_AUTH_URL is not empty and being populated during otc configure

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.