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:
...
@@ -32,6 +32,15 @@ class AnsibleBaseYAMLObject:
def
get_position_info
(
self
):
def
get_position_info
(
self
):
return
(
self
.
_data_source
,
self
.
_line_number
,
self
.
_column_number
)
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
):
class
AnsibleMapping
(
AnsibleBaseYAMLObject
,
dict
):
''' sub class for dictionaries '''
''' sub class for dictionaries '''
pass
pass
...
...
v2/ansible/playbook/role.py
View file @
0ed97e4d
...
@@ -27,21 +27,23 @@ from ansible.playbook.attribute import FieldAttribute
...
@@ -27,21 +27,23 @@ from ansible.playbook.attribute import FieldAttribute
from
ansible.playbook.base
import
Base
from
ansible.playbook.base
import
Base
from
ansible.playbook.block
import
Block
from
ansible.playbook.block
import
Block
from
ansible.parsing
import
load_data_from_file
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
):
class
Role
(
Base
):
_role
=
FieldAttribute
(
isa
=
'string'
)
_role_name
=
FieldAttribute
(
isa
=
'string'
)
_role_path
=
FieldAttribute
(
isa
=
'string'
)
_src
=
FieldAttribute
(
isa
=
'string'
)
_src
=
FieldAttribute
(
isa
=
'string'
)
_scm
=
FieldAttribute
(
isa
=
'string'
)
_scm
=
FieldAttribute
(
isa
=
'string'
)
_version
=
FieldAttribute
(
isa
=
'string'
)
_version
=
FieldAttribute
(
isa
=
'string'
)
_params
=
FieldAttribute
(
isa
=
'dict'
)
_params
=
FieldAttribute
(
isa
=
'dict'
,
default
=
dict
()
)
_metadata
=
FieldAttribute
(
isa
=
'dict'
)
_metadata
=
FieldAttribute
(
isa
=
'dict'
,
default
=
dict
()
)
_task_blocks
=
FieldAttribute
(
isa
=
'list'
)
_task_blocks
=
FieldAttribute
(
isa
=
'list'
,
default
=
[]
)
_handler_blocks
=
FieldAttribute
(
isa
=
'list'
)
_handler_blocks
=
FieldAttribute
(
isa
=
'list'
,
default
=
[]
)
_default_vars
=
FieldAttribute
(
isa
=
'dict'
)
_default_vars
=
FieldAttribute
(
isa
=
'dict'
,
default
=
dict
()
)
_role_vars
=
FieldAttribute
(
isa
=
'dict'
)
_role_vars
=
FieldAttribute
(
isa
=
'dict'
,
default
=
dict
()
)
def
__init__
(
self
,
vault_password
=
None
):
def
__init__
(
self
,
vault_password
=
None
):
self
.
_role_path
=
None
self
.
_role_path
=
None
...
@@ -52,7 +54,7 @@ class Role(Base):
...
@@ -52,7 +54,7 @@ class Role(Base):
return
self
.
get_name
()
return
self
.
get_name
()
def
get_name
(
self
):
def
get_name
(
self
):
return
self
.
_attributes
[
'role'
]
return
self
.
_attributes
[
'role
_name
'
]
@staticmethod
@staticmethod
def
load
(
data
,
vault_password
=
None
):
def
load
(
data
,
vault_password
=
None
):
...
@@ -65,44 +67,52 @@ class Role(Base):
...
@@ -65,44 +67,52 @@ class Role(Base):
# munge, and other functions used for loading the ds
# munge, and other functions used for loading the ds
def
munge
(
self
,
ds
):
def
munge
(
self
,
ds
):
# Role definitions can be strings or dicts, so we fix
# create the new ds as an AnsibleMapping, so we can preserve any line/column
# things up here. Anything that is not a role name, tag,
# data from the parser, and copy that info from the old ds (if applicable)
# or conditional will also be added to the params sub-
new_ds
=
AnsibleMapping
()
# dictionary for loading later
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
):
if
isinstance
(
ds
,
string_types
):
new_ds
=
dict
(
role
=
ds
)
new_ds
[
'role_name'
]
=
ds
else
:
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
)
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
()
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
):
for
(
key
,
value
)
in
iteritems
(
ds
):
if
key
not
in
[
name
for
(
name
,
value
)
in
self
.
_get_base_attributes
()
.
iteritems
()]:
if
key
not
in
attr_names
and
key
!=
'role'
:
# this key does not match a field attribute,
# this key does not match a field attribute, so it must be a role param
# so it must be a role param
params
[
key
]
=
value
params
[
key
]
=
value
else
:
else
:
# this is a field attribute, so copy it over directly
# this is a field attribute, so copy it over directly
new_ds
[
key
]
=
value
new_ds
[
key
]
=
value
# finally, assign the params to a new entry in the revised ds
new_ds
[
'params'
]
=
params
new_ds
[
'params'
]
=
params
# set the role path, based on the role definition
# Set the role name and path, based on the role definition
self
.
_role_path
=
self
.
_get_role_path
(
new_ds
.
get
(
'role'
))
(
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
# load the role's files, if they exist
new_ds
[
'metadata'
]
=
self
.
_load_role_yaml
(
'meta'
)
new_ds
[
'metadata'
]
=
self
.
_load_role_yaml
(
role_path
,
'meta'
)
new_ds
[
'task_blocks'
]
=
self
.
_load_role_yaml
(
'tasks'
)
new_ds
[
'task_blocks'
]
=
self
.
_load_role_yaml
(
role_path
,
'tasks'
)
new_ds
[
'handler_blocks'
]
=
self
.
_load_role_yaml
(
'handlers'
)
new_ds
[
'handler_blocks'
]
=
self
.
_load_role_yaml
(
role_path
,
'handlers'
)
new_ds
[
'default_vars'
]
=
self
.
_load_role_yaml
(
'defaults'
)
new_ds
[
'default_vars'
]
=
self
.
_load_role_yaml
(
role_path
,
'defaults'
)
new_ds
[
'role_vars'
]
=
self
.
_load_role_yaml
(
'vars'
)
new_ds
[
'role_vars'
]
=
self
.
_load_role_yaml
(
role_path
,
'vars'
)
# and return the newly munged ds
return
new_ds
return
new_ds
def
_load_role_yaml
(
self
,
subdir
):
def
_load_role_yaml
(
self
,
role_path
,
subdir
):
file_path
=
os
.
path
.
join
(
self
.
_
role_path
,
subdir
)
file_path
=
os
.
path
.
join
(
role_path
,
subdir
)
if
os
.
path
.
exists
(
file_path
)
and
os
.
path
.
isdir
(
file_path
):
if
os
.
path
.
exists
(
file_path
)
and
os
.
path
.
isdir
(
file_path
):
main_file
=
self
.
_resolve_main
(
file_path
)
main_file
=
self
.
_resolve_main
(
file_path
)
if
os
.
path
.
exists
(
main_file
):
if
os
.
path
.
exists
(
main_file
):
...
@@ -119,7 +129,7 @@ class Role(Base):
...
@@ -119,7 +129,7 @@ class Role(Base):
)
)
if
sum
([
os
.
path
.
isfile
(
x
)
for
x
in
possible_mains
])
>
1
:
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
:
else
:
for
m
in
possible_mains
:
for
m
in
possible_mains
:
if
os
.
path
.
isfile
(
m
):
if
os
.
path
.
isfile
(
m
):
...
@@ -136,15 +146,23 @@ class Role(Base):
...
@@ -136,15 +146,23 @@ class Role(Base):
# FIXME: this should use unfrackpath once the utils code has been sorted out
# FIXME: this should use unfrackpath once the utils code has been sorted out
role_path
=
os
.
path
.
normpath
(
role
)
role_path
=
os
.
path
.
normpath
(
role
)
print
(
"first role path is
%
s"
%
role_path
)
if
os
.
path
.
exists
(
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
:
else
:
for
path
in
(
'./roles'
,
'/etc/ansible/roles'
):
for
path
in
(
'./roles'
,
'/etc/ansible/roles'
):
role_path
=
os
.
path
.
join
(
path
,
role
)
role_path
=
os
.
path
.
join
(
path
,
role
)
print
(
"current role path is
%
s"
%
role_path
)
if
os
.
path
.
exists
(
role_path
):
if
os
.
path
.
exists
(
role_path
):
return
role_path
print
(
'returning role path
%
s'
%
role_path
)
# FIXME: raise something here
return
(
role
,
role_path
)
raise
# 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
):
def
_repo_url_to_role_name
(
self
,
repo_url
):
# gets the role name out of a repo like
# gets the role name out of a repo like
...
@@ -198,12 +216,12 @@ class Role(Base):
...
@@ -198,12 +216,12 @@ class Role(Base):
if
len
(
tokens
)
==
3
:
if
len
(
tokens
)
==
3
:
role_name
=
tokens
[
2
]
role_name
=
tokens
[
2
]
else
:
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
:
if
scm
and
not
role_version
:
role_version
=
default_role_versions
.
get
(
scm
,
''
)
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
):
def
_munge_role
(
self
,
ds
):
if
'role'
in
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