Example #1
0
def do_project_branches_list(self, options):

    h2 = httplib2.Http("~/.rpathcmd/.cache")
    h2.disable_ssl_certificate_validation = True
    h2.add_credentials(self.options.username, self.options.password)

    branchesdatapages = []
  
    tmpxml =  h2.request('http://' + self.options.server + '/api/v1/project_branches')
    branchesdatapages.append(tmpxml[1])

    tmpdata = xobj.parse(tmpxml[1])

    #epdb.st()
    if int(tmpdata.project_branches.num_pages) == 1:
        print "#one page"
    else:
        print "pagination not yet supported"
        sys.exit(1)

    for branchesdatapage in branchesdatapages:
        branchesdata = xobj.parse(branchesdatapage)
        for project_branch in branchesdata.project_branches.project_branch:
            #epdb.st()
            print "%s: %s %s" % (project_branch.branch_id, 
                                project_branch.project.short_name, 
                                project_branch.name)
Example #2
0
    def testQuerySetWithMissingFilter(self):
        # RCE-1879
        # Create queryset
        response = self._post('query_sets/',
            data=testsxml.queryset_post_xml,
            username="******", password="******")
        self.assertEquals(response.status_code, 200)
        xobjModel = xobj.parse(response.content)

        qs1 = models.QuerySet.objects.get(
                query_set_id=str(xobjModel.query_set.query_set_id))
        xml = """\
<query_set>
  <filter_entries>
    <filter_entry>
      <operator>LIKE</operator>
      <field>name</field>
      <value>jdl</value>
    </filter_entry>
    <filter_entry>
      <field/>
      <operator>EQUAL</operator>
      <value/>
    </filter_entry>
  </filter_entries>
</query_set>
"""
        response = self._put("query_sets/%s" % qs1.pk,
            username="******", password="******",
            data=xml)
        self.assertEquals(response.status_code, 400)
        xobjModel = xobj.parse(response.content)
        self.assertEquals(xobjModel.fault.message,
                'null value in column "field" violates not-null constraint\nDETAIL:  Failing row contains (21, null, EQUAL, null).\n')
Example #3
0
 def testImageOrdering(self):
     user = usermodels.User.objects.get(user_name='ExampleDeveloper')
     stage = projectsmodels.Stage.objects.filter(
         project__short_name='chater-foo',
         project_branch__name='1',
         name='Development')[0]
     for name in [ 'a', 'b', 'c', 'A', 'B', 'C' ]:
         img = models.Image(name=name,
                 project_branch_stage=stage,
                 created_by=user,
                 status=300)
         self.mgr.createImageBuild(img, for_user=user)
     self.mgr.commit()
     response = self._get('query_sets/%s/all;order_by=name' % self.all_images.query_set_id,
             username='******', password='******')
     self.assertEquals(response.status_code, 200)
     doc = xobj.parse(response.content)
     self.assertEquals(
             [ x.name for x in doc.images.image ],
             ['A', 'B', 'C', 'a', 'b', 'c'])
     # Same deal, reverse order
     response = self._get('query_sets/%s/all;order_by=-name' % self.all_images.query_set_id,
             username='******', password='******')
     self.assertEquals(response.status_code, 200)
     doc = xobj.parse(response.content)
     self.assertEquals(
             [ x.name for x in doc.images.image ],
             ['c', 'b', 'a', 'C', 'B', 'A'])
Example #4
0
    def testPOST(self):
        # Test POST of an XObj object tree.
        xml = self.getArchiveContents('employee1.xml')
        doc = xobj.parse(xml)
        model = doc.employee

        robj = self._client.do_POST('/employees', model)
        employee = robj._root

        # Make sure the model that is returned matches the one that was sent.
        self.failUnlessEqual(model.name, employee.name)
        self.failUnlessEqual(model.address.street, employee.address.street)
        self.failUnlessEqual(model.address.city, employee.address.city)
        self.failUnlessEqual(model.address.state, employee.address.state)
        self.failUnlessEqual(model.address.zipcode, employee.address.zipcode)
        self.failUnlessEqual(model.phone, employee.phone)
        self.failUnlessEqual(employee.employeeid, '0')
        self.failUnlessEqual(employee.id, '/api/employees/0')

        # Make sure there is an error raised when no document is provided.
        self.failUnlessRaises(TypeError, self._client.do_POST, '/employees')

        # Make sure POST of an XObj document works.
        xml2 = self.getArchiveContents('employee2.xml')
        doc2 = xobj.parse(xml2)

        robj = self._client.do_POST('/employees', doc2)
        employee2 = robj._root

        self.failUnlessEqual(doc2.employee.name, employee2.name)
        self.failUnlessEqual(employee2.employeeid, '1')
Example #5
0
    def testGetQuerySetAll(self):
        # show that we can get results from a query set
        qsid = self._getQs("All Systems")
        response = self._get("query_sets/%s/all;start_index=0;limit=9999" % qsid,
            username="******", password="******")
        self.assertEquals(response.status_code, 200)
        systems = xobj.parse(response.content)
        count = len(systems.systems.system)
        self.failUnlessEqual(count, 201)

        # we will have tagged it by visiting the last pass
        # now hit it again and run down the "tagged" path
        # for code coverage purposes & make sure we get
        # the same result
        response = self._get("query_sets/%s/all;start_index=0;limit=9999" % qsid,
            username="******", password="******")
        self.assertEquals(response.status_code, 200)
        systems = xobj.parse(response.content)
        count = len(systems.systems.system)
        self.failUnlessEqual(count, 201)

        # since we just fetched the queryset, the queryset entry itself
        # should now have an invalidation job on it which we can use
        # have it re-tag on the next pass
        response = self._get("query_sets/%s" % qsid,
            username="******", password="******")
        self.assertEquals(response.status_code, 200)
        self.assertXMLEquals(response.content, testsxml.queryset_with_actions,
          ignoreNodes=[
             'filter_entry_id', 'created_date',
             'last_login_date', 'created_by', 'modified_by',
             'tagged_date', 'modified_date', 'is_public', 'is_static',
          ])

        # every queryset should have a "universe" URL that points to the all
        # collection for the given queryset type
        response = self._get("query_sets/%s/universe" % qsid,
            username="******", password="******")
        self.assertEquals(response.status_code, 200)

        # the tagged date should be set because we ran the queryset 
        # at least once.
        # post the invalidation job to the queryset and verify the tagged
        # date goes back to null
        queryset = models.QuerySet.objects.get(pk=qsid)
        self.assertTrue(queryset.tagged_date is not None)
        response = self._post("query_sets/%s/jobs" % qsid,
            data=testsxml.queryset_invalidate_post_xml, 
            username="******", password="******")
        self.assertEquals(response.status_code, 200)
        queryset = models.QuerySet.objects.get(pk=qsid)
        self.assertEquals(queryset.tagged_date, None)

        # verify that asking for 0 results returns 0 results
        # (not this should happen)
        response = self._get("query_sets/%s/all;start_index=0;limit=0" % qsid,
            username="******", password="******")
        self.assertEquals(response.status_code, 200)
Example #6
0
 def _testUpdateImageBuildFile(self, username, expected_code):
     response = self._post('images/1/build_files/',
         username=username, password='******', data=testsxml.build_file_post_xml)
     self.assertEqual(response.status_code, expected_code)
     if expected_code != 200:
         return
     buildFile = xobj.parse(response.content)
     file_id = buildFile.file.file_id
     response = self._put('images/1/build_files/%s' % file_id,
         username=username, password='******', data=testsxml.build_file_put_xml)
     self.assertEquals(response.status_code, expected_code)
     buildFileUpdated = xobj.parse(response.content)
     self.assertEquals(buildFileUpdated.file.title, 'newtitle')
Example #7
0
    def testGetAggregateProjectBranchStages(self):
        self._initProject()
        response = self._get('project_branch_stages/',
            username="******", password="******", pagination=';start_index=0;limit=9999')
        self.assertEquals(response.status_code, 200)
        stages = xobj.parse(response.content).project_branch_stages.project_branch_stage
        oldMaxDiff = self.maxDiff
        self.maxDiff = None
        self.failUnlessEqual([ x.label for x in stages ],
            [
                'label',
                'postgres.rpath.com@rpath:postgres-1-qa',
                'postgres.rpath.com@rpath:postgres-1',
                'postgres.rpath.com@rpath:postgres-2-devel',
                'postgres.rpath.com@rpath:postgres-2-qa',
                'postgres.rpath.com@rpath:postgres-2',
                'postgres-private.rpath.com@rpath:postgres-1-devel',
                'postgres-private.rpath.com@rpath:postgres-1-qa',
                'postgres-private.rpath.com@rpath:postgres-1',
                'foo@ns:trunk-devel',
                'foo@ns:trunk-qa',
                'foo@ns:trunk-stage',
                'foo@ns:trunk'
            ])
        self.maxDiff = oldMaxDiff

        # developer can still fetch all stages collection since it's a queryset,
        # though it should return only what he can see.  FIXME: determine
        # if what we get is actually correct before adding XML test.
        response = self._get('project_branch_stages/',
            username='******', password="******")
        self.assertEquals(response.status_code, 200)
Example #8
0
    def testAddProject(self):

        response = self._post('projects',
            data=testsxml.project_post_xml,
            username="******", password="******")
        self.assertEquals(response.status_code, 200)
        project = xobj.parse(response.content).project
        projectId = project.project_id
        project = models.Project.objects.get(pk=projectId)
        self.assertEquals("test-project", project.name)
        self.assertEquals(1, project.created_by.user_id)
        self.assertEquals(1, project.modified_by.user_id)
        self.assertTrue(project.created_date is not None)
        self.assertTrue(project.modified_date is not None)

        # adding project again should give a 400 error
        response = self._post('projects',
            data=testsxml.project_post_xml,
            username="******", password="******")
        self.assertEquals(response.status_code, 409)

        # same short name, different name (APPENG-2999)
        xml = testsxml.project_post_xml.replace("<name>test-project</name>",
                "<name>another test project</name>")
        response = self._post('projects',
            data=xml,
            username="******", password="******")
        self.assertEquals(response.status_code, 409)
Example #9
0
    def configureTargetCredentials(self, target, ddata):
        '''
        Configure credentials for a target

        @param ddata: descriptor for target
        @type ddata: DescriptorData
        @param target: target to configure
        @type target: rObj(target)
        @return: the configured target
        @rtype: rObj(target)
        '''
        # make sure our target object is up to date
        target.refresh()

        doc = xobj.Document()
        doc.job = job = xobj.XObj()
        job.job_type = target.actions[1]._root.job_type
        job.descriptor = target.actions[1]._root.descriptor
        job.descriptor_data = xobj.parse(ddata.toxml()).descriptor_data

        jobObj = target.jobs.append(doc)
        while jobObj.job_state.name in ['Queued', 'Running']:
            jobObj.refresh()

        if jobObj.job_state.name == 'Failed':
            raise errors.RbuildError('Unable to set credentials')
        return target
Example #10
0
    def testCreateJob(self):
        jobXml = """
<job>
  <job_type id="http://localhost/api/v1/inventory/event_types/19"/>
  <descriptor id="http://testserver/api/v1/target_types/6/descriptor_create_target"/>
  <descriptor_data>
    <alias>newbie</alias>
    <description>Brand new cloud</description>
    <name>newbie.eng.rpath.com</name>
    <zone>Local rBuilder</zone>
  </descriptor_data>
</job>
"""
        response = self._post('jobs', jobXml,
            username='******', password='******')
        self.assertEquals(response.status_code, 200)
        obj = xobj.parse(response.content)
        job = obj.job
        self.failUnlessEqual(job.descriptor.id, "http://testserver/api/v1/target_types/6/descriptor_create_target")

        dbjob = models.Job.objects.get(job_uuid=unicode(job.job_uuid))
        # Make sure the job is related to the target type
        self.failUnlessEqual(
            [ x.target_type.name for x in dbjob.jobtargettype_set.all() ],
            [ 'xen-enterprise' ],
        )
Example #11
0
    def testUpdateJob(self):
        jobUuid = 'jobUuid1'
        jobToken = 'jobToken1'
        job = self._newJob(jobUuid, jobToken=jobToken,
            jobType=models.EventType.TARGET_REFRESH_IMAGES)

        jobXml = """
<job>
  <job_status>Completed</job_status>
  <status_code>200</status_code>
  <status_text>Some status here</status_text>
  <results encoding="identity">
    <images>
      <image id="id1">
        <imageId>id1</imageId>
      </image>
      <image id="id2">
        <imageId>id2</imageId>
      </image>
    </images>
  </results>
</job>
"""
        response = self._put('jobs/%s' % jobUuid, jobXml,
            jobToken=jobToken)
        self.assertEquals(response.status_code, 200)
        obj = xobj.parse(response.content)
        self.failUnlessEqual(obj.job.id, "http://testserver/api/v1/jobs/%s" % job.job_uuid)
Example #12
0
    def testCreateTarget(self):
        client = rbuilderfacade.RbuilderRESTClient('http://localhost', 'foo',
                                                   'bar', mock.MockObject())
        mock.mock(client, '_api')
        _targets = []

        def _append(x, tag=None):
            _targets.append(x)
            return x

        client._api.targets._mock.set(append=_append)
        _ddata = {
            'name': 'foo',
            'zone': 'local',
            'description': 'Foo',
        }
        ddata = mock.MockObject()
        ddata._mock.set(getField=lambda x: _ddata[x])

        expected_results = xobj.parse(TARGET_XML)

        results = client.createTarget(ddata, 'vmware')
        self.assertEqual(results.toxml(), expected_results.toxml())
        self.assertTrue(len(_targets) == 1)

        def _append_error(x, tag=None):
            raise robj.errors.HTTPConflictError(uri=None,
                                                status=None,
                                                reason=None,
                                                response=None)

        client._api.targets._mock.set(append=_append_error)
        self.assertRaises(errors.RbuildError, client.createTarget, ddata,
                          'vmware')
        self.assertTrue(len(_targets) == 1)
Example #13
0
    def cancel(self, image):
        '''
        Cancel a currently running image build

        :param image: image obj
        :type image: rObj(image)
        '''
        if image.status != '100':
            raise CancelImageError(msg="Image '%s' is not currently building" %
                image.image_id)

        cancelAction = [a for a in image.actions if a.key == self.CANCEL]
        if not cancelAction:
            raise CancelImageError(msg="Unable to find cancel action for"
                " image '%s'" % image.image_id)
        cancelAction = cancelAction[0]
        ddata = self.handle.DescriptorConfig.createDescriptorData(
            fromStream=cancelAction.descriptor)
        doc = xobj.Document()
        doc.job = job = xobj.XObj()

        job.job_type = cancelAction._root.job_type
        job.descriptor = cancelAction._root.descriptor
        job.descriptor_data = xobj.parse(ddata.toxml()).descriptor_data
        return image.jobs.append(doc)
Example #14
0
    def _createJob(self, action_type, image_name, target_name, doLaunch):
        rb = self.handle.facade.rbuilder

        images = self.getImages(image_name)
        target = rb.getTargets(name=target_name)
        if not target:
            raise errors.PluginError("No target matching '%s'" % target_name)
        target = target[0]
        if target.is_configured == 'false':
            raise errors.PluginError(("Target '{0}' is not configured. Try"
                " running \"rbuild edit target '{0}'\" or contacting"
                " your rbuilder administrator.").format(target.name))

        if target.credentials_valid == 'false':
            raise errors.PluginError(("Target '{0}' does not have valid"
                " credentials. Try running \"rbuild edit target '{0}'\""
                " and updating your credentials.").format(target.name))

        image, action = self._getAction(images, target, action_type)

        ddata = self.handle.DescriptorConfig.createDescriptorData(
            fromStream=action.descriptor)

        doc = xobj.Document()
        doc.job = job = xobj.XObj()

        job.job_type = action._root.job_type
        job.descriptor = action._root.descriptor
        job.descriptor_data = xobj.parse(ddata.toxml()).descriptor_data

        if doLaunch:
            return image.jobs.append(doc)
Example #15
0
    def testCanGetImageTypeDefinitionDescriptor(self):

        # make sure we can load all the valid types
        for image_type in mint.buildtypes.xmlTagNameImageTypeMap.keys():
            # we do not have XML for netboot/live because they're deprecated
            # and deferred is special so we want to test differently
            if image_type in ['netbootImage', 'liveIsoImage', 'deferredImage']:
                continue
            # verify we can get the descriptor
            url = "platforms/image_type_definition_descriptors/%s" % image_type
            response = self._get(url) #, username='******', password='******')
            self.assertEquals(response.status_code, 200)
            model = xobj.parse(response.content)
            self.failUnlessEqual(model.descriptor._xobj.tag, 'descriptor')
            # Check for constraints
            fields = dict((x.name, x) for x in model.descriptor.dataFields.field)
            field = fields.get('options.freespace')
            if field is not None:
                self.assertEquals(field.constraints.range.min, '16')
            field = fields.get('options.swapSize')
            if field is not None:
                self.assertEquals(field.constraints.range.min, '16')
            field = fields.get('options.vmMemory')
            if field is not None:
                self.assertEquals(field.constraints.range.min, '256')
            field = fields.get('options.vmCPUs')
            if field is not None:
                self.assertEquals(field.constraints.range.min, '1')
                self.assertEquals(field.constraints.range.max, '32')

        # an invalid one should 404
        response = self._get('platforms/image_type_definition_descriptors/doesNotExist')
        #    username='******', password='******')
        self.assertEquals(response.status_code, 404)
Example #16
0
    def configureTargetCredentials(self, target, ddata):
        '''
        Configure credentials for a target

        @param ddata: descriptor for target
        @type ddata: DescriptorData
        @param target: target to configure
        @type target: rObj(target)
        @return: the configured target
        @rtype: rObj(target)
        '''
        # make sure our target object is up to date
        target.refresh()

        doc = xobj.Document()
        doc.job = job = xobj.XObj()
        job.job_type = target.actions[1]._root.job_type
        job.descriptor = target.actions[1]._root.descriptor
        job.descriptor_data = xobj.parse(ddata.toxml()).descriptor_data

        jobObj = target.jobs.append(doc)
        while jobObj.job_state.name in ['Queued', 'Running']:
            jobObj.refresh()

        if jobObj.job_state.name == 'Failed':
            raise errors.RbuildError('Unable to set credentials')
        return target
Example #17
0
def do_image_info(self, options):


    # input validation ... TBD :(
    image_id = options


    #epdb.st()

    h2 = httplib2.Http("~/.rpathcmd/.cache")
    h2.disable_ssl_certificate_validation = True
    h2.add_credentials(self.options.username, self.options.password)

 
    # fetch the imageid
    tmpxml =  h2.request('http://' + self.options.server + '/api/v1/images/' + image_id)
    tmpdata = xobj.parse(tmpxml[1])

    #epdb.st()

    print "id: " + tmpdata.image.image_id
    print "name: " + tmpdata.image.name
    print "type: " + tmpdata.image.image_type.key
    print "timecreated: " + tmpdata.image.time_created
    print "trovename: " + tmpdata.image.trove_name
    print "trailingversion: " + tmpdata.image.trailing_version
    print "troveversion: " + tmpdata.image.trove_version 
    print "troveflavor: " + tmpdata.image.trove_flavor

    print "fileid: " + tmpdata.image.files.file.file_id
    print "filetitle: " + tmpdata.image.files.file.title
    print "fileurl: " + tmpdata.image.files.file.url
Example #18
0
    def testLocalCacheOfCollections(self):
        xml = """\
<?xml version='1.0' encoding='UTF-8'?>
<results>
  <package>
    <components>
      <component>
        <uuid>DA94B959-D786-4D58-8428-2991DE6A4FE5</uuid>
        <path>Program Files\WindowsAppTest</path>
      </component>
      <component>
        <uuid>DA94B959-D786-4D58-8428-2991DE6A4FE6</uuid>
        <path>Program Files\WindowsAppTest2</path>
      </component>
    </components>
  </package>
</results>
"""

        doc = xobj.parse(xml)
        root = doc.results

        results = rObjProxy('/results', None, root, parent=None)

        self.failUnlessEqual(results.package.components[0].uuid,
            'DA94B959-D786-4D58-8428-2991DE6A4FE5')
        self.failUnlessEqual(results.package.components[1].uuid,
            'DA94B959-D786-4D58-8428-2991DE6A4FE6')
Example #19
0
    def _createJob(self, action_type, image_name, target_name, doLaunch):
        rb = self.handle.facade.rbuilder

        project, branch, stage = self._getProductStage()
        image_name, _, version = image_name.partition('=')
        images = rb.getImages(
            image_name,
            project=project,
            branch=branch,
            stage=stage,
            trailingVersion=version,
        )

        image, action = self._getAction(images, target_name, action_type)

        ddata = self.handle.DescriptorConfig.createDescriptorData(
            fromStream=action.descriptor)

        doc = xobj.Document()
        doc.job = job = xobj.XObj()

        job.job_type = action._root.job_type
        job.descriptor = action._root.descriptor
        job.descriptor_data = xobj.parse(ddata.toxml()).descriptor_data

        if doLaunch:
            return image.jobs.append(doc)
Example #20
0
    def cancel(self, image):
        '''
        Cancel a currently running image build

        :param image: image obj
        :type image: rObj(image)
        '''
        if image.status != '100':
            raise CancelImageError(msg="Image '%s' is not currently building" %
                                   image.image_id)

        cancelAction = [a for a in image.actions if a.key == self.CANCEL]
        if not cancelAction:
            raise CancelImageError(msg="Unable to find cancel action for"
                                   " image '%s'" % image.image_id)
        cancelAction = cancelAction[0]
        ddata = self.handle.DescriptorConfig.createDescriptorData(
            fromStream=cancelAction.descriptor)
        doc = xobj.Document()
        doc.job = job = xobj.XObj()

        job.job_type = cancelAction._root.job_type
        job.descriptor = cancelAction._root.descriptor
        job.descriptor_data = xobj.parse(ddata.toxml()).descriptor_data
        return image.jobs.append(doc)
Example #21
0
    def testCanListPermissions(self):
        url = 'rbac/grants'
        content = self.req(url, method='GET', expect=403, is_authenticated=True)
        content = self.req(url, method='GET', expect=200, is_admin=True)

        obj = xobj.parse(content)
        found_items = self._xobj_list_hack(obj.grants.grant)
        self.assertEqual(len(found_items), 10, 'right number of items')
        # no need to test full list dump, have test of single
        # self.assertXMLEquals(content, testsxml.permission_list_xml)

        # verify that grants also show up on roles objects
        # via associations
        url = 'rbac/roles'
        content = self.req(url, method='GET', expect=200, is_admin=True)
        self.assertXMLEquals(content, testsxml.role_list_xml_with_grants)

        # verify that we can also retrieve permissions (grants) via
        # queryset and the result is the same as from the collection
        queryset = querymodels.QuerySet.objects.get(name='All Grants')
        url = "query_sets/%s/all" % queryset.pk
        content = self.req(url, method='GET', expect=200, is_admin=True)
        # listing test no longer needed
        # self.assertXMLEquals(content, testsxml.permission_queryset_xml)

        # verify we can list permissions off the role itself
        sysadmin = models.RbacRole.objects.get(name='sysadmin')
        url = "rbac/roles/%s/grants/" % sysadmin.pk
        content = self.req(url, method='GET', expect=200, is_admin=True)
        self.assertXMLEquals(content, testsxml.permission_list_xml_for_role)
Example #22
0
    def _createJob(self, action_type, image_name, target_name, doLaunch):
        rb = self.handle.facade.rbuilder

        images = self.getImages(image_name)
        target = rb.getTargets(name=target_name)
        if not target:
            raise errors.PluginError("No target matching '%s'" % target_name)
        target = target[0]
        if target.is_configured == 'false':
            raise errors.PluginError(
                ("Target '{0}' is not configured. Try"
                 " running \"rbuild edit target '{0}'\" or contacting"
                 " your rbuilder administrator.").format(target.name))

        if target.credentials_valid == 'false':
            raise errors.PluginError(
                ("Target '{0}' does not have valid"
                 " credentials. Try running \"rbuild edit target '{0}'\""
                 " and updating your credentials.").format(target.name))

        image, action = self._getAction(images, target, action_type)

        ddata = self.handle.DescriptorConfig.createDescriptorData(
            fromStream=action.descriptor)

        doc = xobj.Document()
        doc.job = job = xobj.XObj()

        job.job_type = action._root.job_type
        job.descriptor = action._root.descriptor
        job.descriptor_data = xobj.parse(ddata.toxml()).descriptor_data

        if doLaunch:
            return image.jobs.append(doc)
Example #23
0
 def testGetQuerySet(self):
     # show that we can get the definition of a queryset
     qsid = self._getQs("All Systems")
     response = self._get("query_sets/%s" % qsid,
         username="******", password="******")
     self.assertEquals(response.status_code, 200)
     querySet = xobj.parse(response.content)
     self.failUnlessEqual(querySet.query_set.name, 'All Systems')
Example #24
0
    def testCanGetSingleRole(self):

        url = 'rbac/roles/3'
        content = self.req(url, method='GET', expect=403, is_authenticated=True)
        content = self.req(url, method='GET', expect=200, is_admin=True)
        obj = xobj.parse(content)
        self.assertEqual(obj.role.name, 'developer')
        self.assertXMLEquals(content, testsxml.role_get_xml)
Example #25
0
 def testAddProjectNoHostname(self):
     response = self._post('projects',
         data=testsxml.project_post_no_hostname_xml,
         username="******", password="******")
     self.assertEquals(response.status_code, 200)
     project = xobj.parse(response.content).project
     projectId = project.project_id
     project = models.Project.objects.get(pk=projectId)
     self.assertEquals("test-project", project.hostname)
Example #26
0
 def _testCreateImage(self, username, expected_code):
     url = 'images/'
     response = self._post(url, username=username, password='******', data=testsxml.image_post_xml)
     self.assertEquals(response.status_code, expected_code)
     if expected_code == 200:
         image = xobj.parse(response.content)
         self.assertEquals(image.image.name, 'image-20')
         self.assertEquals(image.image.trove_name, 'troveName20')
         self.assertEquals(image.image.image_id, u'4')
Example #27
0
 def testCanListUserRoles(self):
     user_id = self.admin_user.pk
     url = "users/%s/roles/" % user_id
     content = self.req(url, method='GET', expect=403, is_authenticated=True)
     content = self.req(url, method='GET', expect=200, is_admin=True)
     obj = xobj.parse(content)
     found_items = self._xobj_list_hack(obj.roles.role)
     self.assertEqual(len(found_items), 3, 'right number of items')
     self.assertXMLEquals(content, testsxml.user_role_list_xml)
Example #28
0
def do_project_branch_imagedef_create(self, args):
   
    # https://$RBA/api/products/$PROJECT_SHORTNAME/versions/1.0/imageTypeDefinitions
    # PUT XML ... imagedef-esx-x86.template

    # $RBA
    # $PROJECT_SHORTNAME
    # $FREESPACE == 1024 (MB)

    moduledir = os.path.dirname(self.sys.modules['rpathcmd.systems'].__file__)
    xmldir = moduledir + '/xml/'
    templatefile = xmldir + 'imagedef-esx-x8664.template'
    templatedata = open(templatefile, 'r')

    (args, options) = parse_arguments(args)
    projectshortname = args[0]
    branch_name = args[1]
    freespace = args[2]

    values = {  'RBA': self.options.server,
                'PROJECT_SHORTNAME': projectshortname,
                'BRANCH_NAME': branch_name,
                'FREESPACE': freespace}

    template = TextTemplate(templatedata, lookup='lenient')
    stream = template.generate(**values)
    postxml = stream.render('text')


    print "-----------<POSTDATA>-----------"
    print postxml
    print "-----------<POSTDATA>-----------"

    # initialize httlib2 and add credentials
    h2 = httplib2.Http("~/.rpathcmd/.cache")
    h2.disable_ssl_certificate_validation = True
    h2.add_credentials(self.options.username, self.options.password)

    # make POST request
    returndata = h2.request('http://' + self.options.server +
                            '/api/products/' + str(projectshortname) + 
                            '/versions/' + branch_name + '/imageDefinitions',
                            headers={'Content-Type': 'application/xml'},
                            method="PUT",
                            body=postxml)

    #epdb.st()
    #pprint(returndata)
    if returndata[0]['status'] != '200':
        print "creation failed: %s" % returndata[0]['status']
        sys.exit(1)
    else:
        print "creation completed: %s" % returndata[0]['status']


    returnxml = xobj.parse(returndata[1])
    print returnxml
Example #29
0
    def testListQuerySet(self):
        # show that we can list all query sets
        response = self._get('query_sets/',
            username="******", password="******")
        self.assertEquals(response.status_code, 200)
        querySets = xobj.parse(response.content)
        length = len(querySets.query_sets.query_set)
        # ok to bump this if we add more QS in the db
        self.assertEqual(length, 10)

        # favorite queryset view returns what to show in
        # the UI navigation
        response = self._get('favorites/query_sets/',
            username="******", password="******")
        self.assertEquals(response.status_code, 200)
        querySets = xobj.parse(response.content)
        length = len(querySets.favorite_query_sets.query_set)
        self.assertEqual(length, 10)
Example #30
0
    def testGetImageJobs(self):

        # TODO: rbac tests somewhat missing -- need to isolate some errors
        # with rmake mocking not working in my environment -- MPD

        imageId = 3

        for i in range(3):
            jobTypes = [ jobsmodels.EventType.TARGET_DEPLOY_IMAGE,
                jobsmodels.EventType.TARGET_LAUNCH_SYSTEM ]
            for j, jobType in enumerate(jobTypes):
                jobUuid = "job-uuid-%02d-%02d" % (i, j)
                job = self._newJob(jobUuid, jobType=jobType)
                models.JobImage.objects.create(job=job, image_id=imageId)

        # TODO: add tests for non-admon access w/ rights
        self.mgr.retagQuerySetsByType('image')
        response = self._get('images/%s/jobs' % imageId,
            username='******', password='******')
        if response.status_code != 200:
            print response.content
        self.failUnlessEqual(response.status_code, 200)
        doc = xobj.parse(response.content)
        self.failUnlessEqual([ x.job_uuid for x in doc.jobs.job ],
            [
                'job-uuid-02-01',
                'job-uuid-02-00',
                'job-uuid-01-01',
                'job-uuid-01-00',
                'job-uuid-00-01',
                'job-uuid-00-00',
            ])

        # Test sorting by job description
        response = self._get('images/%s/jobs?order_by=non_existent_field' % imageId,
            username='******', password='******')
        self.unmock()
        self.assertEquals(response.status_code, 400)
        doc = xobj.parse(response.content)
        self.assertEquals(doc.fault.code, '400')
        self.assertTrue(doc.fault.message.startswith(
            "Cannot resolve keyword u'non_existent_field' into field."),
            doc.fault.message)
Example #31
0
 def testAddProjectNoRepoHostname(self):
     response = self._post('projects',
         data=testsxml.project_post_no_repo_hostname_xml,
         username="******", password="******")
     self.assertEquals(response.status_code, 200)
     project = xobj.parse(response.content).project
     projectId = project.project_id
     project = models.Project.objects.get(pk=projectId)
     self.assertEquals("test-project.eng.rpath.com", project.repository_hostname)
     self.assertEquals(1, project.created_by.user_id)
Example #32
0
 def testAddProjectNoNamespace(self):
     response = self._post('projects',
         data=testsxml.project_post_no_namespace_xml,
         username="******", password="******")
     self.assertEquals(response.status_code, 200)
     project = xobj.parse(response.content).project
     projectId = project.project_id
     project = models.Project.objects.get(pk=projectId)
     self.assertEquals(project.namespace, 'ns')
     self.assertEquals(1, project.created_by.user_id)
Example #33
0
def do_project_create(self, args):
   
    # https://qa3.eng.rpath.com/api/v1/projects
    # POST XML ... project_template.xml

    # $NAME
    # $SHORT_NAME

    print "not done"
    moduledir = os.path.dirname(self.sys.modules['rpathcmd.systems'].__file__)
    xmldir = moduledir + '/xml/'
    templatefile = xmldir + 'project_template.xml'
    templatedata = open(templatefile, 'r')

    (args, options) = parse_arguments(args)
    projectname = args[0]
    projectshortname = args[1]

    values = {  'NAME': projectname,
                'SHORT_NAME': projectshortname}

    template = TextTemplate(templatedata, lookup='lenient')
    stream = template.generate(**values)
    postxml = stream.render('text')
    print "########## <POSTDATA> ##########"
    print postxml
    print "########## ^POSTDATA^ ##########"    


    # initialize httlib2 and add credentials
    h2 = httplib2.Http("~/.rpathcmd/.cache")
    h2.disable_ssl_certificate_validation = True
    h2.add_credentials(self.options.username, self.options.password)

    # make POST request
    returndata = h2.request('http://' + self.options.server +
                            '/api/v1/projects',
                            headers={'Content-Type': 'application/xml'},
                            method="POST",
                            body=postxml)

    #pprint(returndata)
    if returndata[0]['status'] != '200':
        print "creation failed: %s" % returndata[0]['status']
        sys.exit(1)
    else:
        print "creation completed: %s" % returndata[0]['status']


    returnxml = xobj.parse(returndata[1])
    #epdb.st()
    print "projectid: %s" % returnxml.project.project_id
    print "name: %s" % returnxml.project.name
    print "shortname: %s" % returnxml.project.short_name
    print "hostname: %s" % returnxml.project.hostname
Example #34
0
def do_images_list(self, options):

    h2 = httplib2.Http("~/.rpathcmd/.cache")
    h2.disable_ssl_certificate_validation = True
    h2.add_credentials(self.options.username, self.options.password)

    #a list of each page's xml
    images_data_pages = []
 
    # fetch first page, save and parse 
    tmpxml =  h2.request('http://' + self.options.server + '/api/v1/images')
    images_data_pages.append(tmpxml[1])
    tmpdata = xobj.parse(tmpxml[1])

    #epdb.st()
    # to paginate or not to paginate, that is the question.
    if int(tmpdata.images.num_pages) == 1:
        print "#one page"
    else:
        print "%s pages" % tmpdata.images.num_pages
        next_page_url = tmpdata.images.next_page
        while next_page_url != '':
            # fetch next page
            print "fetching %s" % next_page_url
            nextxml = h2.request(tmpdata.images.next_page)
            # save data
            images_data_pages.append(nextxml[1])
            # parse xml
            nextdata = xobj.parse(nextxml[1])
            # check next page
            next_page_url = nextdata.images.next_page
            #epdb.st()

    #epdb.st()
    for images_data_page in images_data_pages:
        images_data = xobj.parse(images_data_page)
        #epdb.st()
        for image in images_data.images.image:
            #epdb.st()

            #print "%s: %s %s=%s" %(image.image_id, image.name, image.trove_name, image.trove_version)
            print "%s: %s %s=%s" %(image.image_id, image.name, image.trove_name, image.trailing_version )
Example #35
0
    def _getCancelBuildJob(self, image):
        cancelAction = image.actions[0]
        ddata = self.handle.DescriptorConfig.createDescriptorData(
            fromStream=cancelAction.descriptor)
        doc = xobj.Document()
        doc.job = job = xobj.XObj()

        job.job_type = cancelAction._root.job_type
        job.descriptor = cancelAction._root.descriptor
        job.descriptor_data = xobj.parse(ddata.toxml()).descriptor_data
        return image.jobs.append(doc)
Example #36
0
 def xobjSystems(self, url):
     url = url + ";start_index=0;limit=9999"
     response = self._get(url,
         username="******", password="******")
     xobjModel = xobj.parse(response.content)
     systems = None
     try:
         systems = xobjModel.systems.system
     except AttributeError:
         return []
     return self.xobjHack(systems)
Example #37
0
            def c(self, url, raw = False, auth = ('test', 'foo'),
                  entitlements = [], checkHeaders = {}):
                if not url.startswith('http:'):
                    url = 'http://localhost' + url

                    (scheme, netloc, path, query, fragment) = \
                        urlparse.urlsplit(url)

                    mappedLoc = self.map[netloc]

                    finalUrl = "%sapi%s" % (mappedLoc, path)

                    if query:
                        finalUrl += '?' + query
                else:
                    finalUrl = url

                req = urllib2.Request(finalUrl)

                if auth:
                    req.add_header('Authorization',
                            'Basic ' + base64.encodestring('%s:%s' % auth))

                if entitlements:
                    l = [ "* %s" % base64.b64encode(x) for x in entitlements ]
                    req.add_header('X-Conary-Entitlement', " ".join(l))

                f = urllib2.urlopen(req)
                for key, val in checkHeaders.iteritems():
                    assert(f.headers[key] == val)

                s = f.read()
                f.close()

                if raw:
                    return s

                return xobj.parse(s)
Example #38
0
    def thaw(cls, xml):
        """
        Deserialize an xml string into a DocManager instance.
        """

        return xobj.parse(xml, documentClass=cls)