Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
ansible
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
ansible
Commits
bb6d9832
Commit
bb6d9832
authored
Mar 26, 2015
by
Rene Moser
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
cloudstack: add utils for common functionality
parent
e9c8e89c
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
182 additions
and
0 deletions
+182
-0
lib/ansible/module_utils/cloudstack.py
+182
-0
No files found.
lib/ansible/module_utils/cloudstack.py
0 → 100644
View file @
bb6d9832
# -*- coding: utf-8 -*-
#
# (c) 2015, René Moser <mail@renemoser.net>
#
# This code is part of Ansible, but is an independent component.
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
import
sys
try
:
from
cs
import
CloudStack
,
CloudStackException
,
read_config
except
ImportError
:
print
(
"failed=True "
+
\
"msg='python library cs required: pip install cs'"
)
sys
.
exit
(
1
)
class
AnsibleCloudStack
:
def
__init__
(
self
,
module
):
self
.
module
=
module
self
.
_connect
()
self
.
project_id
=
None
self
.
ip_address_id
=
None
self
.
zone_id
=
None
self
.
vm_id
=
None
self
.
os_type_id
=
None
self
.
hypervisor
=
None
def
_connect
(
self
):
api_key
=
self
.
module
.
params
.
get
(
'api_key'
)
api_secret
=
self
.
module
.
params
.
get
(
'secret_key'
)
api_url
=
self
.
module
.
params
.
get
(
'api_url'
)
api_http_method
=
self
.
module
.
params
.
get
(
'api_http_method'
)
if
api_key
and
api_secret
and
api_url
:
self
.
cs
=
CloudStack
(
endpoint
=
api_url
,
key
=
api_key
,
secret
=
api_secret
,
method
=
api_http_method
)
else
:
self
.
cs
=
CloudStack
(
**
read_config
())
def
get_project_id
(
self
):
if
self
.
project_id
:
return
self
.
project_id
project
=
self
.
module
.
params
.
get
(
'project'
)
if
not
project
:
return
None
projects
=
self
.
cs
.
listProjects
()
if
projects
:
for
p
in
projects
[
'project'
]:
if
project
in
[
p
[
'name'
],
p
[
'displaytext'
],
p
[
'id'
]
]:
self
.
project_id
=
p
[
'id'
]
return
self
.
project_id
self
.
module
.
fail_json
(
msg
=
"project '
%
s' not found"
%
project
)
def
get_ip_address_id
(
self
):
if
self
.
ip_address_id
:
return
self
.
ip_address_id
ip_address
=
self
.
module
.
params
.
get
(
'ip_address'
)
if
not
ip_address
:
self
.
module
.
fail_json
(
msg
=
"IP address param 'ip_address' is required"
)
args
=
{}
args
[
'ipaddress'
]
=
ip_address
args
[
'projectid'
]
=
self
.
get_project_id
()
ip_addresses
=
self
.
cs
.
listPublicIpAddresses
(
**
args
)
if
not
ip_addresses
:
self
.
module
.
fail_json
(
msg
=
"IP address '
%
s' not found"
%
args
[
'ipaddress'
])
self
.
ip_address_id
=
ip_addresses
[
'publicipaddress'
][
0
][
'id'
]
return
self
.
ip_address_id
def
get_vm_id
(
self
):
if
self
.
vm_id
:
return
self
.
vm_id
vm
=
self
.
module
.
params
.
get
(
'vm'
)
if
not
vm
:
self
.
module
.
fail_json
(
msg
=
"Virtual machine param 'vm' is required"
)
args
=
{}
args
[
'projectid'
]
=
self
.
get_project_id
()
vms
=
self
.
cs
.
listVirtualMachines
(
**
args
)
if
vms
:
for
v
in
vms
[
'virtualmachine'
]:
if
vm
in
[
v
[
'name'
],
v
[
'id'
]
]:
self
.
vm_id
=
v
[
'id'
]
return
self
.
vm_id
self
.
module
.
fail_json
(
msg
=
"Virtual machine '
%
s' not found"
%
vm
)
def
get_zone_id
(
self
):
if
self
.
zone_id
:
return
self
.
zone_id
zone
=
self
.
module
.
params
.
get
(
'zone'
)
zones
=
self
.
cs
.
listZones
()
# use the first zone if no zone param given
if
not
zone
:
self
.
zone_id
=
zones
[
'zone'
][
0
][
'id'
]
return
self
.
zone_id
if
zones
:
for
z
in
zones
[
'zone'
]:
if
zone
in
[
z
[
'name'
],
z
[
'id'
]
]:
self
.
zone_id
=
z
[
'id'
]
return
self
.
zone_id
self
.
module
.
fail_json
(
msg
=
"zone '
%
s' not found"
%
zone
)
def
get_os_type_id
(
self
):
if
self
.
os_type_id
:
return
self
.
os_type_id
os_type
=
self
.
module
.
params
.
get
(
'os_type'
)
if
not
os_type
:
return
None
os_types
=
self
.
cs
.
listOsTypes
()
if
os_types
:
for
o
in
os_types
[
'ostype'
]:
if
os_type
in
[
o
[
'description'
],
o
[
'id'
]
]:
self
.
os_type_id
=
o
[
'id'
]
return
self
.
os_type_id
self
.
module
.
fail_json
(
msg
=
"OS type '
%
s' not found"
%
os_type
)
def
get_hypervisor
(
self
):
if
self
.
hypervisor
:
return
self
.
hypervisor
hypervisor
=
self
.
module
.
params
.
get
(
'hypervisor'
)
hypervisors
=
self
.
cs
.
listHypervisors
()
# use the first hypervisor if no hypervisor param given
if
not
hypervisor
:
self
.
hypervisor
=
hypervisors
[
'hypervisor'
][
0
][
'name'
]
return
self
.
hypervisor
for
h
in
hypervisors
[
'hypervisor'
]:
if
hypervisor
.
lower
()
==
h
[
'name'
]
.
lower
():
self
.
hypervisor
=
h
[
'name'
]
return
self
.
hypervisor
self
.
module
.
fail_json
(
msg
=
"Hypervisor '
%
s' not found"
%
hypervisor
)
def
_poll_job
(
self
,
job
=
None
,
key
=
None
):
if
'jobid'
in
job
:
while
True
:
res
=
self
.
cs
.
queryAsyncJobResult
(
jobid
=
job
[
'jobid'
])
if
res
[
'jobstatus'
]
!=
0
:
if
'jobresult'
in
res
and
key
is
not
None
and
key
in
res
[
'jobresult'
]:
job
=
res
[
'jobresult'
][
key
]
break
time
.
sleep
(
2
)
return
job
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment