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
0ed97e4d
Commit
0ed97e4d
authored
Oct 21, 2014
by
James Cammarata
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updating v2 Role class code
parent
4c86bd3c
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
64 additions
and
37 deletions
+64
-37
v2/ansible/parsing/yaml/objects.py
+9
-0
v2/ansible/playbook/role.py
+55
-37
No files found.
v2/ansible/parsing/yaml/objects.py
View file @
0ed97e4d
...
...
@@ -32,6 +32,15 @@ class AnsibleBaseYAMLObject:
def
get_position_info
(
self
):
return
(
self
.
_data_source
,
self
.
_line_number
,
self
.
_column_number
)
def
copy_position_info
(
obj
):
''' copies the position info from another object '''
assert
isinstance
(
obj
,
AnsibleBaseYAMLObject
)
(
src
,
line
,
col
)
=
obj
.
get_position_info
()
self
.
_data_source
=
src
self
.
_line_number
=
line
self
.
_column_number
=
col
class
AnsibleMapping
(
AnsibleBaseYAMLObject
,
dict
):
''' sub class for dictionaries '''
pass
...
...
v2/ansible/playbook/role.py
View file @
0ed97e4d
...
...
@@ -27,21 +27,23 @@ from ansible.playbook.attribute import FieldAttribute
from
ansible.playbook.base
import
Base
from
ansible.playbook.block
import
Block
from
ansible.parsing
import
load_data_from_file
from
ansible.errors
import
AnsibleError
#from ansible.utils import list_union, unfrackpath
from
ansible.parsing.yaml.objects
import
AnsibleBaseYAMLObject
,
AnsibleMapping
class
Role
(
Base
):
_role
=
FieldAttribute
(
isa
=
'string'
)
_role_name
=
FieldAttribute
(
isa
=
'string'
)
_role_path
=
FieldAttribute
(
isa
=
'string'
)
_src
=
FieldAttribute
(
isa
=
'string'
)
_scm
=
FieldAttribute
(
isa
=
'string'
)
_version
=
FieldAttribute
(
isa
=
'string'
)
_params
=
FieldAttribute
(
isa
=
'dict'
)
_metadata
=
FieldAttribute
(
isa
=
'dict'
)
_task_blocks
=
FieldAttribute
(
isa
=
'list'
)
_handler_blocks
=
FieldAttribute
(
isa
=
'list'
)
_default_vars
=
FieldAttribute
(
isa
=
'dict'
)
_role_vars
=
FieldAttribute
(
isa
=
'dict'
)
_params
=
FieldAttribute
(
isa
=
'dict'
,
default
=
dict
()
)
_metadata
=
FieldAttribute
(
isa
=
'dict'
,
default
=
dict
()
)
_task_blocks
=
FieldAttribute
(
isa
=
'list'
,
default
=
[]
)
_handler_blocks
=
FieldAttribute
(
isa
=
'list'
,
default
=
[]
)
_default_vars
=
FieldAttribute
(
isa
=
'dict'
,
default
=
dict
()
)
_role_vars
=
FieldAttribute
(
isa
=
'dict'
,
default
=
dict
()
)
def
__init__
(
self
,
vault_password
=
None
):
self
.
_role_path
=
None
...
...
@@ -52,7 +54,7 @@ class Role(Base):
return
self
.
get_name
()
def
get_name
(
self
):
return
self
.
_attributes
[
'role'
]
return
self
.
_attributes
[
'role
_name
'
]
@staticmethod
def
load
(
data
,
vault_password
=
None
):
...
...
@@ -65,44 +67,52 @@ class Role(Base):
# munge, and other functions used for loading the ds
def
munge
(
self
,
ds
):
# Role definitions can be strings or dicts, so we fix
# things up here. Anything that is not a role name, tag,
# or conditional will also be added to the params sub-
# dictionary for loading later
# create the new ds as an AnsibleMapping, so we can preserve any line/column
# data from the parser, and copy that info from the old ds (if applicable)
new_ds
=
AnsibleMapping
()
if
isinstance
(
ds
,
AnsibleBaseYAMLObject
):
new_ds
.
copy_position_info
(
ds
)
# Role definitions can be strings or dicts, so we fix things up here.
# Anything that is not a role name, tag, or conditional will also be
# added to the params sub-dictionary for loading later
if
isinstance
(
ds
,
string_types
):
new_ds
=
dict
(
role
=
ds
)
new_ds
[
'role_name'
]
=
ds
else
:
# munge the role ds here to correctly fill in the various fields which
# may be used to define the role, like: role, src, scm, etc.
ds
=
self
.
_munge_role
(
ds
)
# now we split any random role params off from the role spec and store
# them in a dictionary of params for parsing later
params
=
dict
()
new_ds
=
dict
()
attr_names
=
[
attr_name
for
(
attr_name
,
attr_value
)
in
self
.
_get_base_attributes
()
.
iteritems
()]
for
(
key
,
value
)
in
iteritems
(
ds
):
if
key
not
in
[
name
for
(
name
,
value
)
in
self
.
_get_base_attributes
()
.
iteritems
()]:
# this key does not match a field attribute,
# so it must be a role param
if
key
not
in
attr_names
and
key
!=
'role'
:
# this key does not match a field attribute, so it must be a role param
params
[
key
]
=
value
else
:
# this is a field attribute, so copy it over directly
new_ds
[
key
]
=
value
# finally, assign the params to a new entry in the revised ds
new_ds
[
'params'
]
=
params
# set the role path, based on the role definition
self
.
_role_path
=
self
.
_get_role_path
(
new_ds
.
get
(
'role'
))
# Set the role name and path, based on the role definition
(
role_name
,
role_path
)
=
self
.
_get_role_path
(
new_ds
.
get
(
'role_name'
))
new_ds
[
'role_name'
]
=
role_name
new_ds
[
'role_path'
]
=
role_path
# load the role's files, if they exist
new_ds
[
'metadata'
]
=
self
.
_load_role_yaml
(
'meta'
)
new_ds
[
'task_blocks'
]
=
self
.
_load_role_yaml
(
'tasks'
)
new_ds
[
'handler_blocks'
]
=
self
.
_load_role_yaml
(
'handlers'
)
new_ds
[
'default_vars'
]
=
self
.
_load_role_yaml
(
'defaults'
)
new_ds
[
'role_vars'
]
=
self
.
_load_role_yaml
(
'vars'
)
new_ds
[
'metadata'
]
=
self
.
_load_role_yaml
(
role_path
,
'meta'
)
new_ds
[
'task_blocks'
]
=
self
.
_load_role_yaml
(
role_path
,
'tasks'
)
new_ds
[
'handler_blocks'
]
=
self
.
_load_role_yaml
(
role_path
,
'handlers'
)
new_ds
[
'default_vars'
]
=
self
.
_load_role_yaml
(
role_path
,
'defaults'
)
new_ds
[
'role_vars'
]
=
self
.
_load_role_yaml
(
role_path
,
'vars'
)
# and return the newly munged ds
return
new_ds
def
_load_role_yaml
(
self
,
subdir
):
file_path
=
os
.
path
.
join
(
self
.
_
role_path
,
subdir
)
def
_load_role_yaml
(
self
,
role_path
,
subdir
):
file_path
=
os
.
path
.
join
(
role_path
,
subdir
)
if
os
.
path
.
exists
(
file_path
)
and
os
.
path
.
isdir
(
file_path
):
main_file
=
self
.
_resolve_main
(
file_path
)
if
os
.
path
.
exists
(
main_file
):
...
...
@@ -119,7 +129,7 @@ class Role(Base):
)
if
sum
([
os
.
path
.
isfile
(
x
)
for
x
in
possible_mains
])
>
1
:
raise
errors
.
AnsibleError
(
"found multiple main files at
%
s, only one allowed"
%
(
basepath
))
raise
AnsibleError
(
"found multiple main files at
%
s, only one allowed"
%
(
basepath
))
else
:
for
m
in
possible_mains
:
if
os
.
path
.
isfile
(
m
):
...
...
@@ -136,15 +146,23 @@ class Role(Base):
# FIXME: this should use unfrackpath once the utils code has been sorted out
role_path
=
os
.
path
.
normpath
(
role
)
print
(
"first role path is
%
s"
%
role_path
)
if
os
.
path
.
exists
(
role_path
):
return
role_path
role_name
=
os
.
path
.
basename
(
role
)
print
(
'returning role path
%
s'
%
role_path
)
return
(
role_name
,
role_path
)
else
:
for
path
in
(
'./roles'
,
'/etc/ansible/roles'
):
role_path
=
os
.
path
.
join
(
path
,
role
)
print
(
"current role path is
%
s"
%
role_path
)
if
os
.
path
.
exists
(
role_path
):
return
role_path
# FIXME: raise something here
raise
print
(
'returning role path
%
s'
%
role_path
)
return
(
role
,
role_path
)
# FIXME: make the parser smart about list/string entries
# in the yaml so the error line/file can be reported
# here
raise
AnsibleError
(
"the role '
%
s' was not found"
%
role
,
obj
=
role
)
def
_repo_url_to_role_name
(
self
,
repo_url
):
# gets the role name out of a repo like
...
...
@@ -198,12 +216,12 @@ class Role(Base):
if
len
(
tokens
)
==
3
:
role_name
=
tokens
[
2
]
else
:
role_name
=
repo_url_to_role_name
(
tokens
[
0
])
role_name
=
self
.
_
repo_url_to_role_name
(
tokens
[
0
])
if
scm
and
not
role_version
:
role_version
=
default_role_versions
.
get
(
scm
,
''
)
return
dict
(
scm
=
scm
,
src
=
role_url
,
version
=
role_version
,
name
=
role_name
)
return
dict
(
scm
=
scm
,
src
=
role_url
,
version
=
role_version
,
role_
name
=
role_name
)
def
_munge_role
(
self
,
ds
):
if
'role'
in
ds
:
...
...
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