centurylinkcloud / clc-python-sdk Goto Github PK
View Code? Open in Web Editor NEWCenturyLink Cloud CLI & Python SDK
License: Apache License 2.0
CenturyLink Cloud CLI & Python SDK
License: Apache License 2.0
The CLC API supports triggering an OVF import https://www.ctl.io/api-docs/v2/#servers-import-server
Would it be possible to add this to this library? I don't need OVF upload, since I can do that directly via FTP
Currently, the sdk raises the below error when it fails to create or powers off server:
[2015-05-29 02:32:32,257: WARNING/Worker-1] Traceback (most recent call last):
File "/home/zenoss/zcomms/provisioner/provisioner.py", line 127, in create_instance
api_endpoint=CTL_ENDPOINT)
File "/home/zenoss/zcomms/utils/provisioner.py", line 99, in create_instance
description = machine_specs['Description']
File "/usr/lib/python2.6/site-packages/clc/APIv2/server.py", line 471, in Create
'customFields': custom_fields, 'additionalDisks': additional_disks, 'ttl': ttl, 'packages': packages}))))
File "/usr/lib/python2.6/site-packages/clc/APIv2/queue.py", line 49, in init
if 'isQueued' in requests_lst: requests_lst = [requests_lst]
TypeError: argument of type 'NoneType' is not iterable
[2015-05-29 02:32:32,273: INFO/MainProcess] Received task:
def get_events(self, evt):
import clc
File "/usr/lib/python2.6/site-packages/clc/init.py", line 20, in
import APIv2 as v2
File "/usr/lib/python2.6/site-packages/clc/APIv2/init.py", line 21, in
from clc.APIv2.server import Servers, Server
File "/usr/lib/python2.6/site-packages/clc/APIv2/server.py", line 455
if type.lower() == "hyperscale" and storage_type.lower() != "hyperscale" raise(clc.CLCException("Invalid type/storage_type combo"))
Appears that when trying to set only one server attribute the change function is requiring other fields such as memory.
clc.APIFailedResponse: Response code 400. The data for memory does not validate. Explanation: memory value is required.
The V2 API allows you to specify the desired IP address when creating a server, would like to have the CLI include the ability to pass this as an option to "clc server create"
Good monring,
The group-estimate option does not seem to work anymore, please see below:
C:\Python27\Scripts>clc-cli billing group-estimate --alias CCVA --location CA2 --group GavinTest
/ Reading clc.ini
x Exiting due to error: 'module' object has no attribute 'Group'
Is this normal or it is a bug?
Thanks
Gavin
By debugging, it seems reason for create server failure is "Memory limit exceeded", but it is returning
TypeError: init() takes at most 3 arguments (4 given) error.
(Pdb) p r
<Response [400]>
(Pdb) p r.dict
{'cookies': <<class 'requests.cookies.RequestsCookieJar'>[]>, '_content': '{"message":"Memory limit exceeded -> available: 2, requested: 4"}', 'headers': {'content-length': '65', 'expires': '-1', 'pragma': 'no-cache', 'cache-control': 'no-cache', 'date': 'Tue, 07 Apr 2015 21:16:23 GMT', 'content-type': 'application/json; charset=utf-8'}, 'url': u'https://api.ctl.io/v2/servers/AVNI', 'status_code': 400, '_content_consumed': True, 'encoding': 'utf-8', 'request': <PreparedRequest [POST]>, 'connection': <requests.adapters.HTTPAdapter object at 0x2447c90>, 'elapsed': datetime.timedelta(0, 8, 175386), 'raw': <requests.packages.urllib3.response.HTTPResponse object at 0x2451450>, 'reason': 'Bad Request', 'history': []}
(Pdb) c
When the methods ShutDown, PowerOff, PowerOn, and Pause are used against a server that is already in the desired state, they generate a KeyError
exception. All methods generate the same exception. In the following example, I was working with an interactive shell on a server that started off. Server.Reset() behaves as expected, generating an exception describing the error.
As a temporary workaround, I can have my program catch a KeyError in addition to the clc.CLCException error handling and assume that the two represent the same problem, however, this should be fixed.
>>> server.powerState
u'stopped'
>>> server.PowerOn()
<clc.APIv2.queue.Requests object at 0x6ffff321e50>
>>> server.Refresh()
>>> server.powerState
u'started'
>>> server.PowerOn()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/clc/APIv2/server.py", line 368, in PowerOn
def PowerOn(self): return(self._Operation('powerOn'))
File "/usr/lib/python2.7/site-packages/clc/APIv2/server.py", line 357, in _Operation
session=self.session))
File "/usr/lib/python2.7/site-packages/clc/APIv2/queue.py", line 95, in __init__
if r['errorMessage'] == "The server already in desired state.": pass
KeyError: 'errorMessage'
>>> server.Pause()
<clc.APIv2.queue.Requests object at 0x6ffff321f10>
>>> server.Refresh()
>>> server.powerState
u'paused'
>>> server.Pause()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/clc/APIv2/server.py", line 364, in Pause
def Pause(self): return(self._Operation('pause'))
File "/usr/lib/python2.7/site-packages/clc/APIv2/server.py", line 357, in _Operation
session=self.session))
File "/usr/lib/python2.7/site-packages/clc/APIv2/queue.py", line 95, in __init__
if r['errorMessage'] == "The server already in desired state.": pass
KeyError: 'errorMessage'
>>> server.ShutDown()
<clc.APIv2.queue.Requests object at 0x6ffffe6f250>
>>> server.Refresh()
>>> server.powerState
u'stopped'
>>> server.ShutDown()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/clc/APIv2/server.py", line 365, in ShutDown
def ShutDown(self): return(self._Operation('shutDown'))
File "/usr/lib/python2.7/site-packages/clc/APIv2/server.py", line 357, in _Operation
session=self.session))
File "/usr/lib/python2.7/site-packages/clc/APIv2/queue.py", line 95, in __init__
if r['errorMessage'] == "The server already in desired state.": pass
KeyError: 'errorMessage'
>>> server.PowerOff()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/clc/APIv2/server.py", line 369, in PowerOff
def PowerOff(self): return(self._Operation('powerOff'))
File "/usr/lib/python2.7/site-packages/clc/APIv2/server.py", line 357, in _Operation
session=self.session))
File "/usr/lib/python2.7/site-packages/clc/APIv2/queue.py", line 95, in __init__
if r['errorMessage'] == "The server already in desired state.": pass
KeyError: 'errorMessage'
>>> server.Reset()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/clc/APIv2/server.py", line 367, in Reset
def Reset(self): return(self._Operation('reset'))
File "/usr/lib/python2.7/site-packages/clc/APIv2/server.py", line 357, in _Operation
session=self.session))
File "/usr/lib/python2.7/site-packages/clc/APIv2/queue.py", line 101, in __init__
raise(clc.CLCException("%s '%s' not added to queue: %s" % (context_key,context_val,r['errorMessage'])))
clc.CLCException: server '***REDACTED***' not added to queue: The operation cannot be queued for a powered off server.
Would it be possible to update this code base to be compatible with Python 3?
I tried installing this module via both pip and git, and received this same error. I am running Python 3.6.1 on Cygwin and 3.5.2 on Ubuntu.
Traceback (most recent call last):
File "my-file.py", line 1, in <module>
import clc
File "/usr/lib/python3.6/site-packages/clc_sdk-2.46-py3.6.egg/clc/__init__.py", line 19, in <module>
ModuleNotFoundError: No module named 'APIv1'
Using the CLC Ansible module to deploy servers to specified IP addresses, generated the attached Ansible error for certain locations (not all locations failed).
ansible_error.txt
I believe the <6 condition is not necessary or should be <=6 ?
clc-python-sdk/src/clc/APIv2/queue.py
Line 55 in 70858e3
que_reqs_obj = Server.Create(name,template,group_id,network_id)
error_len = que_reqs_obj[0].WaitUntilComplete()
if not error_len
serverobj = que_reqs_obj[0].Server() <---- This is throwing an exception stating that server doesn't exists
SG1 is showing data that actually belongs to a different datacenter (VA1) but not all data centers. See below as UC1 does not show this behavior
# clc networks list --alias XXXXX --location SG1
✔ Logged into v1 API
✔ Networks successfully queried.
+----------------------+----------------------+--------------+
| Name | Description | Gateway |
+----------------------+----------------------+--------------+
| vlan_XXXX_XX.XXX.208 | vlan_XXXX_XX.XXX.208 | XX.XXX.208.1 |
| vlan_XXXX_XX.XXX.216 | vlan_XXXX_XX.XXX.216 | XX.XXX.216.1 |
| vlan_XXXX_XX.XXX.4 | vlan_XXXX_XX.XXX.4 | XX.XXX.4.1 |
| vlan_XXXX_XX.XXX.5 | vlan_XXXX_XX.XXX.5 | XX.XXX.5.1 |
+----------------------+----------------------+--------------+
# clc networks list --alias XXXXX --location VA1
✔ Logged into v1 API
✔ Networks successfully queried.
+----------------------+----------------------+--------------+
| Name | Description | Gateway |
+----------------------+----------------------+--------------+
| vlan_XXXX_XX.XXX.208 | vlan_XXXX_XX.XXX.208 | XX.XXX.208.1 |
| vlan_XXXX_XX.XXX.216 | vlan_XXXX_XX.XXX.216 | XX.XXX.216.1 |
| vlan_XXXX_XX.XXX.4 | vlan_XXXX_XX.XXX.4 | XX.XXX.4.1 |
| vlan_XXXX_XX.XXX.5 | vlan_XXXX_XX.XXX.5 | XX.XXX.5.1 |
+----------------------+----------------------+--------------+
#clc networks list --alias XXXXX --location UC1
✔ Logged into v1 API
✔ Networks successfully queried.
+--------------------+--------------------+-------------+
| Name | Description | Gateway |
+--------------------+--------------------+-------------+
| vlan_XXX_XXX.XX.48 | vlan_XXX_XX.XXX.48 | XX.XXX.XX.1 |
+--------------------+--------------------+-------------+
The exception occurs in the second to the last line of the snippet below. I have actually used server_obj.status before but the same max recursion exception occurred. Note, however, that the exception happens "randomly".
Code:
count = 0
g=clc.v2.Group(group, alias=account)
servers=g.Servers().servers_lst
for s in servers:
if not re.search(r'ZNODE|MASTR', s):
continue
if s.upper() in save:
continue
try:
server_obj = clc.v2.Server(s, alias=account)
except:
continue
if server_obj.data['status'] != 'active':
continue
Exception:
...
File "/home/zenoss/zcomms/utils/provisioner.py", line 257, in cleanup_zgroup
if server_obj.data['status'] != 'active':
File "/usr/lib/python2.6/site-packages/clc/APIv2/server.py", line 217, in __getattr
if key in self.data: return(self.data[key])
File "/usr/lib/python2.6/site-packages/clc/APIv2/server.py", line 217, in getattr
if key in self.data: return(self.data[key])
File "/usr/lib/python2.6/site-packages/clc/APIv2/server.py", line 217, in getattr
if key in self.data: return(self.data[key])
File "/usr/lib/python2.6/site-packages/clc/APIv2/server.py", line 217, in getattr
File "/usr/lib/python2.6/site-packages/clc/APIv2/server.py", line 217, in getattr
if key in self.data: return(self.data[key]
...
Traceback (most recent call last):
File "deploy.py", line 12, in
print create_server(clc_user, clc_pass, clc_account, chef_server_specs)
File "/root/integrator/modules/create_server.py", line 17, in create_server
description = specs['Description']
File "/usr/lib/python2.6/site-packages/clc/APIv2/server.py", line 499, in Create
if type.low() == "baremetal": type = "bareMetal"
https://github.com/CenturyLinkCloud/clc-python-sdk/blob/master/src/dist/clc-cli.exe
this is corrupt and doesn't function
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.