def build_immovable_wombats(folder, jobs): config = "config/buildorama.yml" logger, tkonf = setup_test_config(config) assert tkonf.topLevels() == ['AgileCentral', 'Jenkins', 'Service'] agicen_konf = tkonf.topLevel('AgileCentral') jenk_conf = tkonf.topLevel('Jenkins') jenkins_url = jsh.construct_jenkins_url(jenk_conf) tkonf.add_to_container({ 'Folder': folder, 'AgileCentral_Project': 'Static', 'exclude': jobs[1] }) tkonf.remove_from_container({'Folder': 'Parkour'}) tkonf.remove_from_container({'View': 'Prairie'}) tkonf.remove_from_container({'View': 'Shoreline'}) tkonf.remove_from_container({'Job': 'troglodyte'}) tkonf.remove_from_container({'Job': 'truculent elk medallions'}) assert folder in [ folder_rec['Folder'] for folder_rec in jenk_conf['Folders'] ] for job in jobs: r = jsh.build(jenk_conf, jenkins_url, job, folder=folder) jc = bsh.JenkinsConnection(jenk_conf, logger) jc.connect() return jc
def test_config_defaults(): #config_file = ('defaults.yml') logger = ActivityLogger('log/defaults.log') konf = Konfabulator('config/defaults.yml', logger) jenk_conf = konf.topLevel('Jenkins') ac_conf = konf.topLevel('AgileCentral') srv_config = konf.topLevel('Service') assert not ac_conf.get('Server', None) assert not jenk_conf.get('Server', None) # runner = BuildConnectorRunner([config_file]) # runner.run() agicen = bsh.AgileCentralConnection(konf.topLevel('AgileCentral'), logger) agicen.other_name = 'Jenkins' agicen.project_name = jenk_conf['AgileCentral_DefaultBuildProject'] agicen.connect() assert agicen.server == 'rally1.rallydev.com' assert not agicen.proxy jc = bsh.JenkinsConnection(jenk_conf, logger) jc.connect() assert jc.server == 'coyotepair.ca.com' assert jc.port == 8080 assert jc.protocol == 'http'
def test_find_builds_of_two_jobs(): t = datetime.now() - timedelta(minutes=60) ref_time = t.utctimetuple() job1 = "troblodyte{}".format(time.time()) job2 = "fukebane{}".format(time.time()) two_jobs = [job1, job2] config = "config/buildorama.yml" logger, tkonf = sh.setup_test_config(config) assert tkonf.topLevels() == ['AgileCentral', 'Jenkins', 'Service'] jenk_conf = tkonf.topLevel('Jenkins') jenkins_url = jsh.construct_jenkins_url(jenk_conf) r1 = jsh.create_job(jenk_conf, jenkins_url, job1) assert r1.status_code in [200, 201] tkonf.add_to_container({'Job': job1}) r1 = jsh.create_job(jenk_conf, jenkins_url, job2) assert r1.status_code in [200, 201] tkonf.add_to_container({'Job': job2}) # create two build for the same job r2 = jsh.build(jenk_conf, jenkins_url, job1) assert r2.status_code in [200, 201] time.sleep(10) r2 = jsh.build(jenk_conf, jenkins_url, job2) assert r2.status_code in [200, 201] time.sleep(10) # find two builds target_job_builds = [] time.sleep(10) jc = bsh.JenkinsConnection(jenk_conf, logger) jc.connect() jc.validate() builds = jc.getRecentBuilds(ref_time) view = 'All' # because we created the two jobs at the top level bkey = "%s::%s" % (view, jenk_conf['AgileCentral_DefaultBuildProject']) target_builds = builds[ bkey] # target_builds is a dict keyed by a JenkinsJob instance build_jobs = [job for job in target_builds if job.name in [job1, job2]] # for key, val in builds.items(): # print(key) # # for k, v in val.items(): # # print("...k: %s, v: %s" % (k, v)) # for builds in val.values(): # for build in builds: # print(" %s" % build) assert len(build_jobs) == 2 # delete the jobs for job_name in two_jobs: r3 = jsh.delete_job(jenk_conf, jenkins_url, job_name) assert r3.status_code == 200
def connect_to_jenkins(config_file): config_file = "config/{}".format(config_file) jenk_conf = {} with open(config_file, 'r') as cf: content = cf.read() all_conf = yaml.load(content) jenk_conf = all_conf['JenkinsBuildConnector']['Jenkins'] jc = bsh.JenkinsConnection(jenk_conf, ActivityLogger('inventory.log')) return jc
def test_compare_regular_build_time(): two_days_ago = bsh.epochSeconds("-2d") mock_build = bsh.MockJenkinsBuild("fukebane", 13, "Yuge Disaxter", two_days_ago, 34) ref_time = time.strptime("2015-10-23T10:23:45Z", '%Y-%m-%dT%H:%M:%SZ') logger = bsh.ActivityLogger('test.log') konf = bsh.Konfabulator('config/trumpkin.yaml', logger) jenkins_conf = konf.topLevel('Jenkins') jc = bsh.JenkinsConnection(jenkins_conf, logger) result = mock_build.id_as_ts < ref_time assert result == False
def test_depth(): t = datetime.now() - timedelta(minutes=2) ref_time = t.utctimetuple() naked_job = "freddy-flintstone" config = "config/buildorama.yml" logger, tkonf = sh.setup_test_config(config) assert tkonf.topLevels() == ['AgileCentral', 'Jenkins', 'Service'] jenk_conf = tkonf.topLevel('Jenkins') jc = bsh.JenkinsConnection(jenk_conf, logger) assert (jc.connect()) == True assert jc.validate() assert 'freddy-flintstone' not in jc.all_jobs
def test_folder_config(): t = datetime.now() - timedelta(minutes=60) ref_time = t.utctimetuple() folder = "A{}".format(time.time()) job_name = "frog" config = "config/buildorama.yml" logger, tkonf = sh.setup_test_config(config) assert tkonf.topLevels() == ['AgileCentral', 'Jenkins', 'Service'] jenk_conf = tkonf.topLevel('Jenkins') jenkins_url = jsh.construct_jenkins_url(jenk_conf) # create a jenkins folder and a job in the folder r0 = jsh.create_folder(jenk_conf, jenkins_url, folder) assert r0.status_code in [200, 201] r1 = jsh.create_job(jenk_conf, jenkins_url, job_name, folder=folder) assert r1.status_code in [200, 201] # build in jenkins r2 = jsh.build(jenk_conf, jenkins_url, job_name, folder=folder) assert r2.status_code in [200, 201] time.sleep(10) tkonf.topLevel( 'Jenkins')['AgileCentral_DefaultBuildProject'] = 'Dunder Donut' tkonf.add_to_container({'Folder': folder}) assert tkonf.has_item('Folder', folder) jenk_conf = tkonf.topLevel('Jenkins') jc = bsh.JenkinsConnection(jenk_conf, logger) jc.connect() jc.validate() builds = jc.getRecentBuilds(ref_time) bkey = "%s::%s" % (folder, jenk_conf['AgileCentral_DefaultBuildProject']) target_builds = builds[ bkey] # target_builds is a dict keyed by a JenkinsJob instance build_jobs = [job for job in target_builds if job.name == job_name] assert len(build_jobs) == 1 r3 = jsh.delete_job(jenk_conf, jenkins_url, job_name, folder=folder) assert r3.status_code == 200 r3 = jsh.delete_job(jenk_conf, jenkins_url, folder) assert r3.status_code == 200
def test_same_name_jobs_in_diff_folders(): folder1 = "A1{}".format(time.time()) folder2 = "A2{}".format(time.time()) job_name = "frog" config = "config/buildorama.yml" logger, tkonf = sh.setup_test_config(config) assert tkonf.topLevels() == ['AgileCentral', 'Jenkins', 'Service'] agicen_konf = tkonf.topLevel('AgileCentral') agicen_konf['Workspace'] = 'Alligators BLD Unigrations' tkonf.topLevel('Jenkins')['AgileCentral_DefaultBuildProject'] = 'Jenkins' jenk_conf = tkonf.topLevel('Jenkins') jenkins_url = jsh.construct_jenkins_url(jenk_conf) r0 = jsh.create_folder(jenk_conf, jenkins_url, folder1) assert r0.status_code in [200, 201] r0 = jsh.create_folder(jenk_conf, jenkins_url, folder2) assert r0.status_code in [200, 201] r1 = jsh.create_job(jenk_conf, jenkins_url, job_name, folder=folder1) assert r1.status_code in [200, 201] r1 = jsh.create_job(jenk_conf, jenkins_url, job_name, folder=folder2) assert r1.status_code in [200, 201] tkonf.add_to_container({ 'Folder': folder1, 'AgileCentral_Project': 'Dunder Donut' }) tkonf.add_to_container({ 'Folder': folder2, 'AgileCentral_Project': 'Corral' }) tkonf.remove_from_container({'Folder': 'Parkour'}) tkonf.remove_from_container({'View': 'Shoreline'}) tkonf.remove_from_container({'Job': 'truculent elk medallions'}) assert tkonf.has_item('Folder', folder1) assert tkonf.has_item('Folder', folder2) assert tkonf.has_item('Folder', 'Parkour') == False ref_time = datetime.now() - timedelta(minutes=5) jenkins_url = jsh.construct_jenkins_url(jenk_conf) r1 = jsh.build(jenk_conf, jenkins_url, job_name, folder=folder1) assert r1.status_code in [200, 201] time.sleep(10) r2 = jsh.build(jenk_conf, jenkins_url, job_name, folder=folder2) assert r2.status_code in [200, 201] time.sleep(10) assert folder1 in [ folder_rec['Folder'] for folder_rec in jenk_conf['Folders'] ] assert folder2 in [ folder_rec['Folder'] for folder_rec in jenk_conf['Folders'] ] assert 'Parkour' not in [ folder_rec['Folder'] for folder_rec in jenk_conf['Folders'] ] # find two builds target_job_builds = [] jc = bsh.JenkinsConnection(jenk_conf, logger) jc.connect() jc.validate() jenkins_builds = jc.getRecentBuilds(ref_time.utctimetuple()) bc = bsh.BLDConnector(tkonf, logger) query = ['CreationDate >= %s' % ref_time.isoformat()] for view_proj, build_view in jenkins_builds.items(): print(view_proj) for builds in build_view.values(): for bld in builds: print(" %s" % bld) project = view_proj.split('::')[1] print("PROJECT %s" % project) build_defn = bc.agicen_conn.ensureBuildDefinitionExists( job_name, project, bld.url) assert build_defn.Project.Name == project agicen_build, status = bc.postBuildToAgileCentral( build_defn, bld, [], job_name) assert agicen_build is not None assert agicen_build.BuildDefinition.Project.Name == project ac_response = bc.agicen_conn._retrieveBuilds(project, query) for build in ac_response: print(" %24.24s Job Name: %24.24s build number: %s " % (build.BuildDefinition.Project.Name, build.BuildDefinition.Name, build.Number)) if build.BuildDefinition.Project.Name != project: for proj in bc.agicen_conn.build_def.keys(): print("build_defn project: %s" % proj) project_jobs = bc.agicen_conn.build_def[proj].keys( ) for job in project_jobs: print(" %s: %s" % (job, bc.agicen_conn.build_def[proj] [job].Project.Name)) assert (build.BuildDefinition.Project.Name) == project assert (build.BuildDefinition.Name) == job_name # delete the jobs r3 = jsh.delete_job(jenk_conf, jenkins_url, job_name, folder=folder1) assert r3.status_code == 200 r3 = jsh.delete_job(jenk_conf, jenkins_url, job_name, folder=folder2) assert r3.status_code == 200 r3 = jsh.delete_job(jenk_conf, jenkins_url, folder1) assert r3.status_code == 200 r3 = jsh.delete_job(jenk_conf, jenkins_url, folder2) assert r3.status_code == 200
def test_find_builds_in_different_containers(): t = datetime.now() - timedelta(minutes=60) ref_time = t.utctimetuple() folder1 = "friendly amphibian{}".format(time.time()) folder2 = "unfriendly amphibian{}".format(time.time()) job1 = "naked-troblodyte{}".format(time.time()) job2 = "foldered-fukebane{}".format(time.time()) job3 = "ignore-it{}".format(time.time()) three_jobs = [job1, job2, job3] config = "config/buildorama.yml" logger, tkonf = sh.setup_test_config(config) assert tkonf.topLevels() == ['AgileCentral', 'Jenkins', 'Service'] jenk_conf = tkonf.topLevel('Jenkins') jenkins_url = jsh.construct_jenkins_url(jenk_conf) r0 = jsh.create_folder(jenk_conf, jenkins_url, folder1) assert r0.status_code in [200, 201] r0 = jsh.create_folder(jenk_conf, jenkins_url, folder2) assert r0.status_code in [200, 201] r1 = jsh.create_job(jenk_conf, jenkins_url, job1) assert r1.status_code in [200, 201] tkonf.add_to_container({'Job': job1}) r1 = jsh.create_job(jenk_conf, jenkins_url, job2, folder=folder1) assert r1.status_code in [200, 201] tkonf.add_to_container({'Folder': folder1}) # create a job in a folder in Jenkins but do not add this folder name to config r1 = jsh.create_job(jenk_conf, jenkins_url, job3, folder=folder2) assert r1.status_code in [200, 201] # check if new containers were added assert tkonf.has_item('Folder', folder1) #assert tkonf.has_item('Folder', folder2) # create two builds for the same job r2 = jsh.build(jenk_conf, jenkins_url, job1) assert r2.status_code in [200, 201] time.sleep(10) r2 = jsh.build(jenk_conf, jenkins_url, job2, folder=folder1) assert r2.status_code in [200, 201] time.sleep(10) r2 = jsh.build(jenk_conf, jenkins_url, job3, folder=folder2) assert r2.status_code in [200, 201] time.sleep(10) # find two builds: a build for job3 should not be found target_job_builds = [] time.sleep(10) jc = bsh.JenkinsConnection(jenk_conf, logger) jc.connect() jc.validate() builds = jc.getRecentBuilds(ref_time) view = 'All' bkey1 = "%s::%s" % (view, jenk_conf['AgileCentral_DefaultBuildProject']) target_builds = builds[ bkey1] # target_builds is a dict keyed by a JenkinsJob instance build_jobs1 = [job for job in target_builds if job.name == job1] bkey2 = "%s::%s" % (folder1, jenk_conf['AgileCentral_DefaultBuildProject']) target_builds = builds[ bkey2] # target_builds is a dict keyed by a JenkinsJob instance build_jobs2 = [job for job in target_builds if job.name == job2] bkey3 = "%s::%s" % (folder2, jenk_conf['AgileCentral_DefaultBuildProject']) assert bkey3 not in builds #target_builds = builds[bkey3] # target_builds is a dict keyed by a JenkinsJob instance #build_jobs3 = [job for job in target_builds if job.name == job3] # for key, val in builds.items(): # print("key: %s, val: %s" % (key, val)) # print(key) # # for k, v in val.items(): # # print("...k: %s, v: %s" % (k, v)) # for builds in val.values(): # for build in builds: # print(" %s" % build) assert len(build_jobs1) == 1 assert len(build_jobs2) == 1 # delete the jobs r3 = jsh.delete_job(jenk_conf, jenkins_url, job1) assert r3.status_code == 200 r3 = jsh.delete_job(jenk_conf, jenkins_url, job2, folder=folder1) assert r3.status_code == 200 r3 = jsh.delete_job(jenk_conf, jenkins_url, job3, folder=folder2) assert r3.status_code == 200 r3 = jsh.delete_job(jenk_conf, jenkins_url, folder1) assert r3.status_code == 200 r3 = jsh.delete_job(jenk_conf, jenkins_url, folder2) assert r3.status_code == 200