Changed project property available_playbooks to playbooks, exposed via API as a child resource of the project detail. Changed project local_path to a CharField and added helper method and API attribute to show the list of available choices for local_path.

This commit is contained in:
Chris Church
2013-05-10 00:44:13 -04:00
parent fdceb46c12
commit d7737f6b43
12 changed files with 414 additions and 51 deletions

View File

@@ -95,8 +95,8 @@ class BaseTestMixin(object):
test_playbook_file.write(playbook_content)
test_playbook_file.close()
return Project.objects.create(
name=name, description=description, local_path=project_dir,
created_by=created_by,
name=name, description=description,
local_path=os.path.basename(project_dir), created_by=created_by,
#scm_type='git', default_playbook='foo.yml',
)

View File

@@ -315,7 +315,7 @@ class BaseJobTest(BaseTest):
job_type='check',
inventory= self.inv_eng,
project=self.proj_dev,
playbook=self.proj_dev.available_playbooks[0],
playbook=self.proj_dev.playbooks[0],
created_by=self.user_sue,
)
self.jt_eng_run = JobTemplate.objects.create(
@@ -323,7 +323,7 @@ class BaseJobTest(BaseTest):
job_type='run',
inventory= self.inv_eng,
project=self.proj_dev,
playbook=self.proj_dev.available_playbooks[0],
playbook=self.proj_dev.playbooks[0],
created_by=self.user_sue,
)
@@ -334,7 +334,7 @@ class BaseJobTest(BaseTest):
job_type='check',
inventory= self.inv_sup,
project=self.proj_test,
playbook=self.proj_test.available_playbooks[0],
playbook=self.proj_test.playbooks[0],
created_by=self.user_sue,
)
self.jt_sup_run = JobTemplate.objects.create(
@@ -342,7 +342,7 @@ class BaseJobTest(BaseTest):
job_type='run',
inventory= self.inv_sup,
project=self.proj_test,
playbook=self.proj_test.available_playbooks[0],
playbook=self.proj_test.playbooks[0],
created_by=self.user_sue,
)
@@ -353,7 +353,7 @@ class BaseJobTest(BaseTest):
job_type='check',
inventory= self.inv_ops_east,
project=self.proj_prod,
playbook=self.proj_prod.available_playbooks[0],
playbook=self.proj_prod.playbooks[0],
credential=self.cred_ops_east,
created_by=self.user_sue,
)
@@ -362,7 +362,7 @@ class BaseJobTest(BaseTest):
job_type='run',
inventory= self.inv_ops_east,
project=self.proj_prod,
playbook=self.proj_prod.available_playbooks[0],
playbook=self.proj_prod.playbooks[0],
credential=self.cred_ops_east,
created_by=self.user_sue,
)
@@ -371,7 +371,7 @@ class BaseJobTest(BaseTest):
job_type='check',
inventory= self.inv_ops_west,
project=self.proj_prod,
playbook=self.proj_prod.available_playbooks[0],
playbook=self.proj_prod.playbooks[0],
credential=self.cred_ops_west,
created_by=self.user_sue,
)
@@ -380,7 +380,7 @@ class BaseJobTest(BaseTest):
job_type='run',
inventory= self.inv_ops_west,
project=self.proj_prod,
playbook=self.proj_prod.available_playbooks[0],
playbook=self.proj_prod.playbooks[0],
credential=self.cred_ops_west,
created_by=self.user_sue,
)
@@ -454,7 +454,7 @@ class JobTemplateTest(BaseJobTest):
inventory = self.inventory.pk,
project = self.project.pk,
job_type = PERM_INVENTORY_DEPLOY,
playbook = self.project.available_playbooks[0],
playbook = self.project.playbooks[0],
)
with self.current_user(self.normal_django_user):
response = self.post(url, data, expect=201)

View File

@@ -42,7 +42,7 @@ class ProjectsTest(BaseTest):
self.setup_users()
self.organizations = self.make_organizations(self.super_django_user, 10)
self.projects = self.make_projects(self.normal_django_user, 10)
self.projects = self.make_projects(self.normal_django_user, 10, TEST_PLAYBOOK)
# add projects to organizations in a more or less arbitrary way
for project in self.projects[0:2]:
@@ -100,50 +100,56 @@ class ProjectsTest(BaseTest):
# here is a user without any permissions...
return ('nobody', 'nobody')
def test_available_playbooks(self):
def test_playbooks(self):
def write_test_file(project, name, content):
full_path = os.path.join(project.local_path, name)
full_path = os.path.join(project.get_project_path(), name)
if not os.path.exists(os.path.dirname(full_path)):
os.makedirs(os.path.dirname(full_path))
f = file(os.path.join(project.local_path, name), 'wb')
f = file(full_path, 'wb')
f.write(content)
f.close()
# Invalid local_path
project = self.projects[0]
project.local_path = os.path.join(project.local_path,
'does_not_exist')
project.local_path = 'path_does_not_exist'
project.save()
self.assertEqual(len(project.available_playbooks), 0)
self.assertFalse(project.get_project_path())
self.assertEqual(len(project.playbooks), 0)
# Simple playbook
project = self.projects[1]
self.assertEqual(len(project.playbooks), 1)
write_test_file(project, 'foo.yml', TEST_PLAYBOOK)
self.assertEqual(len(project.available_playbooks), 1)
self.assertEqual(len(project.playbooks), 2)
# Other files
project = self.projects[2]
self.assertEqual(len(project.playbooks), 1)
write_test_file(project, 'foo.txt', 'not a playbook')
self.assertEqual(len(project.available_playbooks), 0)
self.assertEqual(len(project.playbooks), 1)
# Empty playbook
project = self.projects[3]
self.assertEqual(len(project.playbooks), 1)
write_test_file(project, 'blah.yml', '')
self.assertEqual(len(project.available_playbooks), 0)
self.assertEqual(len(project.playbooks), 1)
# Invalid YAML
project = self.projects[4]
self.assertEqual(len(project.playbooks), 1)
write_test_file(project, 'blah.yml', TEST_PLAYBOOK + '----')
self.assertEqual(len(project.available_playbooks), 0)
self.assertEqual(len(project.playbooks), 1)
# No hosts or includes
project = self.projects[5]
self.assertEqual(len(project.playbooks), 1)
playbook_content = TEST_PLAYBOOK.replace('hosts', 'hoists')
write_test_file(project, 'blah.yml', playbook_content)
self.assertEqual(len(project.available_playbooks), 0)
self.assertEqual(len(project.playbooks), 1)
# Playbook in roles folder
project = self.projects[6]
self.assertEqual(len(project.playbooks), 1)
write_test_file(project, 'roles/blah.yml', TEST_PLAYBOOK)
self.assertEqual(len(project.available_playbooks), 0)
self.assertEqual(len(project.playbooks), 1)
# Playbook in tasks folder
project = self.projects[7]
self.assertEqual(len(project.playbooks), 1)
write_test_file(project, 'tasks/blah.yml', TEST_PLAYBOOK)
self.assertEqual(len(project.available_playbooks), 0)
self.assertEqual(len(project.playbooks), 1)
def test_mainline(self):
@@ -180,6 +186,11 @@ class ProjectsTest(BaseTest):
self.delete(project, expect=204, auth=self.get_normal_credentials())
self.get(project, expect=404, auth=self.get_normal_credentials())
# can list playbooks for projects
proj_playbooks = '/api/v1/projects/%d/playbooks/' % self.projects[2].pk
got = self.get(proj_playbooks, expect=200, auth=self.get_super_credentials())
self.assertEqual(got, self.projects[2].playbooks)
# can list member organizations for projects
proj_orgs = '/api/v1/projects/1/organizations/'
# only usable as superuser

View File

@@ -177,7 +177,7 @@ class RunJobTest(BaseCeleryTest):
'credential': self.credential,
}
try:
opts['playbook'] = self.project.available_playbooks[0]
opts['playbook'] = self.project.playbooks[0]
except (AttributeError, IndexError):
pass
opts.update(kwargs)
@@ -196,7 +196,7 @@ class RunJobTest(BaseCeleryTest):
'credential': self.credential,
}
try:
opts['playbook'] = self.project.available_playbooks[0]
opts['playbook'] = self.project.playbooks[0]
except (AttributeError, IndexError):
pass
opts.update(kwargs)