From cc47f0acac328e1f1b359e33efd67a07b7652cda Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Wed, 7 Sep 2022 15:34:39 +0200 Subject: [PATCH] TT#190200 build: support several levels of dependencies Change-Id: I19a930fe95bb292912dadc67440b750533c34b20 --- build/fixtures/config/mr11.0.yml | 317 +++++++++++++++++++++++++++++++ build/models.py | 11 +- build/test/test_models.py | 30 ++- build/test/test_tasks.py | 109 +++++++---- build/test/test_utils.py | 129 ++++++++++++- build/utils.py | 51 +++-- 6 files changed, 579 insertions(+), 68 deletions(-) create mode 100644 build/fixtures/config/mr11.0.yml diff --git a/build/fixtures/config/mr11.0.yml b/build/fixtures/config/mr11.0.yml new file mode 100644 index 0000000..9f1408b --- /dev/null +++ b/build/fixtures/config/mr11.0.yml @@ -0,0 +1,317 @@ +distris: + - release-mr11.0 + - bullseye + +debian_release: bullseye + +release-mr11.0: &packages + # TT#44190 TT#182900 needed by ngcp-panel + - grafana: 9.0.2 + # TT#69950 needed by bulk-processor, not available in Debian (project abandoned upstream) + - libexcel-reader-xlsx-perl: 0.00~git20161017.3b576a55-0.1sipwise1~bpo11+1 + # TT#73105 system testing + - goss: 0.3.14-0.1~bpo11+1sipwise1 + # TT#44918 Needed for PRO/Carrier + - ngcp-pxe-boot: 0.7.2.2+0~sipwise20220607 + # TT#126500: Fix race in reboot uptime timestamp computation and comparison + - monit: 5.27.2-1sipwise1~bpo11+1 + # TT#59330 rebuild of package pulled from non-free, required for snmp-agent + - snmp-mibs-downloader: 1.5~bpo11+1 + # MT#19499, TT#126650: local robustness patches + - net-snmp: 5.9+dfsg-3sipwise1~bpo11+2 + # TT#149552 needed by lua-sql-kamailio + - lua-sql: 2.6.0-1~bpo11+1 + # TT#154255 replacement of redis, not in debian + - keydb: 6.3.1-1~bpo11+1 + # TT#140500 needed by prometheus stack + - dh-golang: 1.53~bpo11+1 + - golang-1.17: 1.17.8-1~bpo11+1 + - golang-defaults: 1.17~1~bpo11+2 + - golang-github-alecthomas-units: 0.0~git20211218.b94a6e3-1~bpo11+1 + - golang-github-allegro-bigcache: 2.2.5-5~bpo11+1 + - golang-github-andybalholm-brotli: 1.0.4-3~bpo11+1 + - golang-github-beevik-ntp: 0.3.0-4~bpo11+1 + - golang-github-cheggaaa-pb.v3: 3.0.5-2~bpo11+1 + - golang-github-dennwc-varint: 1.0.0-2~bpo11+1 + - golang-github-ema-qdisc: 0.0~git20200603.62d0308-2~bpo11+1 + - golang-github-go-kit-log: 0.2.0-3~bpo11+1 + - golang-github-go-openapi-analysis: 0.21.2-1~bpo11+1 + - golang-github-go-openapi-errors: 0.20.2-1~bpo11+1 + - golang-github-go-openapi-jsonpointer: 0.19.5-3~bpo11+1 + - golang-github-go-openapi-jsonreference: 0.19.6-2~bpo11+1 + - golang-github-go-openapi-loads: 0.21.1-2~bpo11+1 + - golang-github-go-openapi-runtime: 0.23.3-1~bpo11+1 + - golang-github-go-openapi-spec: 0.20.4-1~bpo11+1 + - golang-github-go-openapi-strfmt: 0.21.2-1~bpo11+1 + - golang-github-go-openapi-swag: 0.21.1-1~bpo11+1 + - golang-github-go-openapi-validate: 0.21.0-1~bpo11+1 + - golang-github-hashicorp-go-envparse: 0.0~git20200406.d9cfd74-3~bpo11+1 + - golang-github-hodgesds-perf-utils: 0.5.1-2~bpo11+1 + - golang-github-josharian-native: 1.0.0-1~bpo11+1 + - golang-github-jsimonetti-rtnetlink: 1.1.0-1~bpo11+1 + - golang-github-mattn-go-xmlrpc: 0.0.3-2~bpo11+1 + - golang-github-mdlayher-genetlink: 1.1.0-3~bpo11+1 + - golang-github-mdlayher-netlink: 1.6.0-2~bpo11+1 + - golang-github-mdlayher-socket: 0.1.1-2~bpo11+1 + - golang-github-mdlayher-wifi: 0.0~git20200527.84f0b94-4~bpo11+1 + - golang-github-mna-redisc: 1.1.7-3~bpo11+1 + - golang-github-ncabatoff-go-seq: 0.0~git20180805.b08ef85-4~bpo11+1 + - golang-github-nginxinc-nginx-plus-go-client: 0.9.0-2~bpo11+1 + - golang-github-prometheus-client-golang: 1.11.1-1~bpo11+1 + - golang-github-prometheus-client-model: 0.2.0-3~bpo11+1 + - golang-github-prometheus-common: 0.32.1-6~bpo11+1 + - golang-github-prometheus-exporter-toolkit: 0.7.1-1~bpo11+1 + - golang-github-prometheus-procfs: 0.7.3-2~bpo11+1 + - golang-github-soundcloud-go-runit: 0.0~git20150630.06ad41a-3~bpo11+1 + - golang-github-valyala-fasthttp: 1.31.0-3~bpo11+1 + - golang-github-valyala-fastjson: 1.6.3-4~bpo11+1 + - golang-github-valyala-fastrand: 1.1.0-2~bpo11+1 + - golang-github-valyala-fasttemplate: 1.2.1+ds1-1~bpo11+1 + - golang-github-valyala-gozstd: 1.16.0+ds1-1~bpo11+1 + - golang-github-valyala-histogram: 1.2.0+ds-2~bpo11+1 + - golang-github-valyala-quicktemplate: 1.7.0+ds1-1~bpo11+1 + - golang-github-victoriametrics-fastcache: 1.9.0+ds1-1~bpo11+1 + - golang-github-victoriametrics-metrics: 1.18.1+ds-2~bpo11+1 + - golang-github-victoriametrics-metricsql: 0.40.0+ds1-1~bpo11+1 + - golang-github-xdg-go-pbkdf2: 1.0.0-2~bpo11+1 + - golang-github-xdg-go-scram: 1.1.1-1~bpo11+1 + - golang-github-xdg-go-stringprep: 1.0.3-1~bpo11+1 + - golang-go-flags: 1.4.0-5~bpo11+1 + - golang-mongodb-mongo-driver: 1.8.4+ds1-1~bpo11+1 + - prometheus-alertmanager: 0.23.0-5~bpo11+1 + - prometheus-haproxy-exporter: 0.13.0+ds1-2~bpo11+1 + - prometheus-mysqld-exporter: 0.14.0-1~bpo11+1 + - prometheus-nginx-exporter: 0.10.0-2~bpo11+1 + - prometheus-node-exporter: 1.3.1-1~bpo11+1 + - prometheus-process-exporter: 0.7.10-2sipwise1~bpo11+1 + - prometheus-redis-exporter: 1.37.0-2~bpo11+1 + - prometheus-snmp-exporter: 0.20.0-1~bpo11+1 + - victoriametrics: 1.75.0+ds1-1~bpo11+1 + # TT#187100 asterisk g729 (not even in Debian) + - asterisk-g72x: 0.0~git20201027.3855cec-1~bpo11+1 + +bullseye: *packages + +repository-verify: + white-list: [] + +jenkins-jobs: + build_deps: + system-tests: + - data-hal # jenkins-tap-test-${distribution} needed for tap-test job + - libswrate + - libtcap + - ngcp-panel + - sipwise-base + - system-tools + system-tools: + - check-tools # libngcp-log-perl libngcp-service-perl + data-hal: + - ngcp-panel + ngcp-schema: + - ngcp-panel + libswrate: + - kamailio + - sems-pbx + libtcap: + - kamailio + - lnpd + sipwise-base: + - ngcp-panel + - ngcp-schema + check-tools: + - snmp-agent + ngcpcfg: + - bootenv # libngcp-template-perl needed on Dockerfile + ngcp-panel: + - csta-testsuite # ngcp-api-testframework needed on Dockerfile + projects: + - asterisk-voicemail + - backup-tools + - bulk-processor + - bulk-processor-projects + - bootenv + - cdr-exporter + - cfg-schema + - check-tools + - cleanup-tools + - cloudpbx-sources + - csta-testsuite + - data-hal + - db-schema + - deployment-iso + - dhtest + - documentation + - faxserver + - installer + - kamailio + - kamailio-config-tests + - keyring + - klish + - libswrate + - libtcap + - license-client + - lnpd + - lua-ngcp-kamailio + - mediator + - megacli + - metapackages + - monitoring-tools + - ngcp-admin-ui + - ngcp-api-tools + - ngcp-csc-ui + - ngcp-exporter + - ngcp-fauditd + - ngcp-inventory + - ngcp-js-api-client + - ngcp-logfs + - ngcp-klish-config + - ngcp-panel + - ngcp-prompts + - ngcp-rest-api + - ngcp-schema + - ngcp-status + - ngcp-sudo-plugin + - ngcp-support + - ngcp-user-framework + - ngcp-web-tests-e2e + - ngcpcfg + - ngcpcfg-api + - ngcpcfg-ha + - ngrep-sip + - prosody + - pushd + - py-ngcp-kamailio + - rate-o-mat + - reminder + - rtpengine + - sems + - sems-pbx + - sipwise-base + - snmp-agent + - system-tests + - system-tools + - templates + - upgrade + - vmnotify + - voisniff-ng + - websocket + +release_mirror: + common: + copysrc: + - kamailio-config-tests + - klish + - libdata-hal-perl + - libsipwise-base-perl + - lua-ngcp-kamailio + - ngcp-admin-ui + - ngcp-api-tools + - ngcp-asterisk-voicemail + - ngcp-bulk-processor + - ngcp-cdr-exporter + - ngcp-cfg-schema + - ngcp-check-tools + - ngcp-cleanup-tools + - ngcp-csc-ui + - ngcp-db-schema + - ngcp-deployment-iso + - ngcp-dhtest + - ngcp-handbook + - ngcp-installer + - ngcp-js-api-client + - ngcp-kamailio + - ngcp-keyring + - ngcp-klish-config + - ngcp-libswrate + - ngcp-libtcap + - ngcp-license-client + - ngcp-mediator + - ngcp-metapackages + - ngcp-ngcpcfg + - ngcp-panel + - ngcp-prompts + - ngcp-prosody-modules + - ngcp-rate-o-mat + - ngcp-reminder + - ngcp-rest-api + - ngcp-rtpengine + - ngcp-schema + - ngcp-status + - ngcp-support + - ngcp-system-tests + - ngcp-system-tools + - ngcp-templates + - ngcp-upgrade + - ngcp-vmnotify + - ngcp-web-tests-e2e + - ngrep-sip + - py-ngcp-kamailio + remove: + source: + - ngcp-handbook + - ngcp-installer + - ngcp-libswrate + - ngcp-license-client + - ngcp-prompts + - ngcp-templates + - ngcp-upgrade + binary: + - ngcp-handbook-internal + - ngcp-handbook-pdf-internal + matched: [] + ce: + copysrc: + - ngcp-sems + remove: + source: [] + binary: + - ngcp-ngcpcfg-testsuite + matched: + - '*-carrier' + - '*-pro' + - '*-pro-dbgsym' + - 'ngcp-prompts-pro*' + pro: + backports: [] + copysrc: + - megacli + - ngcp-backup-tools + - ngcp-bootenv + - ngcp-bulk-processor-projects + - ngcp-cloudpbx-devices + - ngcp-csta-testsuite + - ngcp-exporter + - ngcp-fauditd + - ngcp-faxserver + - ngcp-inventory + - ngcp-lnpd + - ngcp-logfs + - ngcp-monitoring-tools + - ngcp-ngcpcfg-ha + - ngcp-pushd + - ngcp-sems-pbx + - ngcp-snmp + - ngcp-sudo-plugin + - ngcp-user-framework + - ngcp-voisniff + - ngcp-websocket + - ngcpcfg-api + remove: + binary: [] + source: + - ngcp-cloudpbx-devices + - ngcp-csta-testsuite + - ngcp-fauditd + - ngcp-logfs + - ngcp-monitoring-tools + - ngcp-ngcpcfg-ha + - ngcp-pushd + - ngcp-sems-pbx + - ngcp-sudo-plugin + - ngcp-user-framework + - ngcp-voisniff + - ngcpcfg-api + matched: + - '*ngcp*-ce' + - '*ngcp*-ce-*' diff --git a/build/models.py b/build/models.py index 8f966d2..b62d7d9 100644 --- a/build/models.py +++ b/build/models.py @@ -365,10 +365,13 @@ class BuildRelease(models.Model): @property def build_deps(self): if getattr(self, "_build_deps", None) is None: - self._build_deps = [ - list(self.config.wanna_build_deps(0)), - list(self.config.wanna_build_deps(1)), - ] + self._build_deps = [] + step = 0 + deps = list(self.config.wanna_build_deps(step)) + while len(deps) > 0: + self._build_deps.append(deps) + step = step + 1 + deps = list(self.config.wanna_build_deps(step)) return self._build_deps @property diff --git a/build/test/test_models.py b/build/test/test_models.py index 3b8fcda..06fe3c5 100644 --- a/build/test/test_models.py +++ b/build/test/test_models.py @@ -202,18 +202,40 @@ class BuildReleaseTestCase(BaseTest): def test_build_deps(self): build_deps = [ [ + "check-tools", "data-hal", "libinewrate", "libswrate", "libtcap", "sipwise-base", - "check-tools", ], ["ngcp-schema"], ] build = BuildRelease.objects.create_build_release("AAA", "trunk") self.assertListEqual(build.build_deps, build_deps) + def test_build_deps_mr11_0(self): + build_deps = [ + [ + "ngcpcfg", + "system-tests", + ], + [ + "data-hal", + "libswrate", + "libtcap", + "sipwise-base", + "system-tools", + ], + [ + "check-tools", + "ngcp-schema", + ], + ["ngcp-panel"], + ] + build = BuildRelease.objects.create_build_release("AAA", "mr11.0") + self.assertListEqual(build.build_deps, build_deps) + class BuildReleaseStepsTest(BaseTest): fixtures = ["test_models"] @@ -330,17 +352,17 @@ class BuildReleaseStepsTest(BaseTest): self.assertIsNone(self.br.next) def test_next_empty(self): - self.assertEqual(self.br.next, "data-hal") + self.assertEqual(self.br.next, "check-tools") def test_next_build_deps(self): build_deps = [ [ + "check-tools", "data-hal", "libinewrate", "libswrate", "libtcap", "sipwise-base", - "check-tools", ], ["ngcp-schema"], ] @@ -364,12 +386,12 @@ class BuildReleaseStepsTest(BaseTest): def test_next_build_deps_stop(self): build_deps = [ + "check-tools", "data-hal", "libinewrate", "libswrate", "libtcap", "sipwise-base", - "check-tools", ] i = 1 self.jbi.projectname = "release-copy-debs-yml" diff --git a/build/test/test_tasks.py b/build/test/test_tasks.py index 631bd20..3776a23 100644 --- a/build/test/test_tasks.py +++ b/build/test/test_tasks.py @@ -47,7 +47,7 @@ class JBIManageTest(BaseTest): result="SUCCESS", ) params = { - "project": "data-hal-get-code", + "project": "check-tools-get-code", "release_uuid": br.uuid, "trigger_release": br.release, "trigger_branch_or_tag": br.branch_or_tag, @@ -56,7 +56,7 @@ class JBIManageTest(BaseTest): tb.assert_called_once_with(**params) br = BuildRelease.objects.get(uuid=self.release_uuid) self.assertEqual(br.pool_size, 1) - self.assertEqual(br.triggered_projects, "data-hal") + self.assertEqual(br.triggered_projects, "check-tools") @override_settings(BUILD_POOL=2) def test_jbi_manage_pool(self, tb, dl): @@ -75,19 +75,19 @@ class JBIManageTest(BaseTest): br = BuildRelease.objects.get(id=br.pk) self.assertEqual(br.built_projects, "release-copy-debs-yml") params = { - "project": "data-hal-get-code", + "project": "check-tools-get-code", "release_uuid": br.uuid, "trigger_release": br.release, "trigger_branch_or_tag": br.branch_or_tag, "trigger_distribution": br.distribution, } calls = [call(**params)] - params["project"] = "libinewrate-get-code" + params["project"] = "data-hal-get-code" calls.append(call(**params)) tb.assert_has_calls(calls) br = BuildRelease.objects.get(pk=br.pk) self.assertEqual(br.pool_size, 2) - self.assertEqual(br.triggered_projects, "data-hal,libinewrate") + self.assertEqual(br.triggered_projects, "check-tools,data-hal") @override_settings(BUILD_POOL=2) def test_jbi_manage_pool_building(self, tb, dl): @@ -95,9 +95,9 @@ class JBIManageTest(BaseTest): br = BuildRelease.objects.get(uuid=self.release_uuid) self.assertEqual(br.pool_size, 2) JenkinsBuildInfo.objects.create( - job_url="http://fake.local/job/data-hal-binaries/", - projectname="data-hal", - jobname="data-hal-binaries", + job_url="http://fake.local/job/check-tools-binaries/", + projectname="check-tools", + jobname="check-tools-binaries", tag="UUIDA", param_release=self.release, param_release_uuid=self.release_uuid, @@ -106,11 +106,11 @@ class JBIManageTest(BaseTest): ) br = BuildRelease.objects.get(id=br.pk) self.assertEqual(br.pool_size, 2) - self.assertEqual(br.triggered_projects, "data-hal,libinewrate") + self.assertEqual(br.triggered_projects, "check-tools,data-hal") JenkinsBuildInfo.objects.create( - job_url="http://fake.local/job/libinewrate-binaries/", - projectname="libinewrate", - jobname="libinewrate-binaries", + job_url="http://fake.local/job/data-hal-binaries/", + projectname="data-hal", + jobname="data-hal-binaries", tag="UUIDA", param_release=self.release, param_release_uuid=self.release_uuid, @@ -119,7 +119,7 @@ class JBIManageTest(BaseTest): ) br = BuildRelease.objects.get(pk=br.pk) self.assertEqual(br.pool_size, 2) - self.assertEqual(br.triggered_projects, "data-hal,libinewrate") + self.assertEqual(br.triggered_projects, "check-tools,data-hal") @override_settings(BUILD_POOL=2) def test_jbi_manage_pool_next(self, tb, dl): @@ -127,9 +127,9 @@ class JBIManageTest(BaseTest): br = BuildRelease.objects.get(uuid=self.release_uuid) self.assertEqual(br.pool_size, 2) JenkinsBuildInfo.objects.create( - job_url="http://fake.local/job/data-hal-repos/", - projectname="data-hal", - jobname="data-hal-repos", + job_url="http://fake.local/job/check-tools-repos/", + projectname="check-tools", + jobname="check-tools-repos", tag="UUIDA", param_release=self.release, param_release_uuid=self.release_uuid, @@ -137,9 +137,11 @@ class JBIManageTest(BaseTest): result="SUCCESS", ) br = BuildRelease.objects.get(pk=br.pk) - self.assertEqual(br.built_projects, "release-copy-debs-yml,data-hal") + self.assertEqual( + br.built_projects, "release-copy-debs-yml,check-tools" + ) params = { - "project": "libswrate-get-code", + "project": "libinewrate-get-code", "release_uuid": br.uuid, "trigger_release": br.release, "trigger_branch_or_tag": br.branch_or_tag, @@ -147,7 +149,7 @@ class JBIManageTest(BaseTest): } tb.assert_called_once_with(**params) self.assertEqual(br.pool_size, 2) - self.assertEqual(br.triggered_projects, "libinewrate,libswrate") + self.assertEqual(br.triggered_projects, "data-hal,libinewrate") @override_settings(BUILD_POOL=3) def test_jbi_manage_pool_deps(self, tb, dl): @@ -164,31 +166,39 @@ class JBIManageTest(BaseTest): result="SUCCESS", ) params = { - "project": "data-hal-get-code", + "project": "check-tools-get-code", "release_uuid": br.uuid, "trigger_release": br.release, "trigger_branch_or_tag": br.branch_or_tag, "trigger_distribution": br.distribution, } calls = [call(**params)] - params["project"] = "libinewrate-get-code" + params["project"] = "data-hal-get-code" calls.append(call(**params)) - params["project"] = "libswrate-get-code" + params["project"] = "libinewrate-get-code" calls.append(call(**params)) tb.assert_has_calls(calls) + br = BuildRelease.objects.get(uuid=self.release_uuid) + self.assertEqual( + br.triggered_projects, "check-tools,data-hal,libinewrate" + ) JenkinsBuildInfo.objects.create( - job_url="http://fake.local/job/data-hal-repos/", - projectname="data-hal", - jobname="data-hal-repos", + job_url="http://fake.local/job/check-tools-repos/", + projectname="check-tools", + jobname="check-tools-repos", tag="UUIDA", param_release=self.release, param_release_uuid=self.release_uuid, buildnumber=1, result="SUCCESS", ) - params["project"] = "libtcap-get-code" + params["project"] = "libswrate-get-code" tb.assert_called_with(**params) + br = BuildRelease.objects.get(uuid=self.release_uuid) + self.assertEqual( + br.triggered_projects, "data-hal,libinewrate,libswrate" + ) JenkinsBuildInfo.objects.create( job_url="http://fake.local/job/libswrate-repos/", @@ -200,13 +210,15 @@ class JBIManageTest(BaseTest): buildnumber=1, result="SUCCESS", ) - params["project"] = "sipwise-base-get-code" + params["project"] = "libtcap-get-code" tb.assert_called_with(**params) + br = BuildRelease.objects.get(uuid=self.release_uuid) + self.assertEqual(br.triggered_projects, "data-hal,libinewrate,libtcap") JenkinsBuildInfo.objects.create( - job_url="http://fake.local/job/libinewrate-repos/", - projectname="libinewrate", - jobname="libinewrate-repos", + job_url="http://fake.local/job/data-hal-repos/", + projectname="data-hal", + jobname="data-hal-repos", tag="UUIDA", param_release=self.release, param_release_uuid=self.release_uuid, @@ -215,9 +227,9 @@ class JBIManageTest(BaseTest): ) br = BuildRelease.objects.get(uuid=self.release_uuid) self.assertEqual( - br.triggered_projects, "libtcap,sipwise-base,check-tools" + br.triggered_projects, "libinewrate,libtcap,sipwise-base" ) - params["project"] = "check-tools-get-code" + params["project"] = "sipwise-base-get-code" tb.assert_called_with(**params) tb.reset_mock() @@ -232,13 +244,13 @@ class JBIManageTest(BaseTest): result="SUCCESS", ) br = BuildRelease.objects.get(uuid=self.release_uuid) - self.assertEqual(br.triggered_projects, "sipwise-base,check-tools") + self.assertEqual(br.triggered_projects, "libinewrate,sipwise-base") tb.assert_not_called() JenkinsBuildInfo.objects.create( - job_url="http://fake.local/job/check-tools-repos/", - projectname="check-tools", - jobname="check-tools-repos", + job_url="http://fake.local/job/libinewrate-repos/", + projectname="libinewrate", + jobname="libinewrate-repos", tag="UUIDA", param_release=self.release, param_release_uuid=self.release_uuid, @@ -263,6 +275,31 @@ class JBIManageTest(BaseTest): self.assertEqual(br.triggered_projects, "ngcp-schema") params["project"] = "ngcp-schema-get-code" tb.assert_called_with(**params) + tb.reset_mock() + + JenkinsBuildInfo.objects.create( + job_url="http://fake.local/job/ngcp-schema-repos/", + projectname="ngcp-schema", + jobname="ngcp-schema-repos", + tag="UUIDA", + param_release=self.release, + param_release_uuid=self.release_uuid, + buildnumber=1, + result="SUCCESS", + ) + br = BuildRelease.objects.get(uuid=self.release_uuid) + self.assertEqual( + br.triggered_projects, + "asterisk-voicemail,lua-ngcp-kamailio,ngcp-panel", + ) + + params["project"] = "asterisk-voicemail-get-code" + calls = [call(**params)] + params["project"] = "lua-ngcp-kamailio-get-code" + calls.append(call(**params)) + params["project"] = "ngcp-panel-get-code" + calls.append(call(**params)) + tb.assert_has_calls(calls) @override_settings(JBI_ALLOWED_HOSTS=["fake.local"]) diff --git a/build/test/test_utils.py b/build/test/test_utils.py index 6511fc0..7051ae4 100644 --- a/build/test/test_utils.py +++ b/build/test/test_utils.py @@ -113,6 +113,7 @@ class ReleaseConfigTestCase(SimpleTestCase): "trunk-weekly", "release-trunk-buster", "release-trunk-bullseye", + "mr11.0", "mr10.1.1", "mr10.1", "mr10.0", @@ -154,7 +155,6 @@ class ReleaseConfigTestCase(SimpleTestCase): def test_ok(self): rc = ReleaseConfig("trunk") self.assertIsNotNone(rc.config) - self.assertListEqual(list(rc.build_deps.keys()), self.build_deps) self.assertEqual(rc.debian_release, "buster") self.assertEqual(len(rc.projects), 73) @@ -202,39 +202,148 @@ class ReleaseConfigTestCase(SimpleTestCase): self.assertEqual(rc.tag, "mr7.5.2.1") def test_build_deps(self): + rc = ReleaseConfig("trunk") + self.assertListEqual(list(rc.build_deps.keys()), self.build_deps) + + def test_build_deps_iter_step_1(self): rc = ReleaseConfig("trunk") build_deps = [ + "check-tools", "data-hal", - "ngcp-schema", "libinewrate", "libswrate", "libtcap", "sipwise-base", + ] + values = [] + res = rc.wanna_build_deps(0) + self.assertListEqual(build_deps, res.list_no_deps[0]) + self.assertListEqual(["ngcp-schema"], res.list_deps[0]) + for prj in res: + values.append(prj) + self.assertListEqual(build_deps, values) + + def test_build_deps_iter_step_2(self): + rc = ReleaseConfig("trunk") + build_deps = ["ngcp-schema"] + values = [] + res = rc.wanna_build_deps(1) + self.assertListEqual([], res.list_deps[1]) + self.assertListEqual(build_deps, res.list_no_deps[1]) + for prj in res: + values.append(prj) + self.assertListEqual(build_deps, values) + + def test_build_deps_iter_step_3(self): + rc = ReleaseConfig("trunk") + values = [] + for prj in rc.wanna_build_deps(2): + values.append(prj) + self.assertListEqual([], values) + + def test_build_deps_mr11_0(self): + rc = ReleaseConfig("mr11.0") + build_deps = [ + "system-tests", + "system-tools", + "data-hal", + "ngcp-schema", + "libswrate", + "libtcap", + "sipwise-base", "check-tools", + "ngcpcfg", + "ngcp-panel", ] self.assertListEqual(list(rc.build_deps.keys()), build_deps) - def test_build_deps_iter_step_1(self): - rc = ReleaseConfig("trunk") + def test_build_deps_mr11_0_iter_step_1(self): + rc = ReleaseConfig("mr11.0") + build_deps = [ + "ngcpcfg", + "system-tests", + ] + values = [] + res = rc.wanna_build_deps(0) + self.assertListEqual( + [ + "check-tools", + "data-hal", + "libswrate", + "libtcap", + "ngcp-panel", + "ngcp-schema", + "sipwise-base", + "system-tools", + ], + res.list_deps[0], + ) + self.assertListEqual(build_deps, res.list_no_deps[0]) + for prj in res: + values.append(prj) + self.assertListEqual(build_deps, values) + + def test_build_deps_mr11_0_iter_step_2(self): + rc = ReleaseConfig("mr11.0") build_deps = [ "data-hal", - "libinewrate", "libswrate", "libtcap", "sipwise-base", + "system-tools", + ] + values = [] + res = rc.wanna_build_deps(1) + self.assertListEqual( + [ + "check-tools", + "ngcp-panel", + "ngcp-schema", + ], + res.list_deps[1], + ) + self.assertListEqual(build_deps, res.list_no_deps[1]) + for prj in res: + values.append(prj) + self.assertListEqual(build_deps, values) + + def test_build_deps_mr11_0_iter_step_3(self): + rc = ReleaseConfig("mr11.0") + build_deps = [ "check-tools", + "ngcp-schema", ] values = [] - for prj in rc.wanna_build_deps(0): + res = rc.wanna_build_deps(2) + self.assertListEqual( + ["ngcp-panel"], + res.list_deps[2], + ) + self.assertListEqual(build_deps, res.list_no_deps[2]) + for prj in res: values.append(prj) self.assertListEqual(build_deps, values) - def test_build_deps_iter_step_2(self): - rc = ReleaseConfig("trunk") + def test_build_deps_mr11_0_iter_step_4(self): + rc = ReleaseConfig("mr11.0") + build_deps = ["ngcp-panel"] + values = [] + res = rc.wanna_build_deps(3) + self.assertListEqual( + [], + res.list_deps[3], + ) + self.assertListEqual(build_deps, res.list_no_deps[3]) + for prj in res: + values.append(prj) + self.assertListEqual(build_deps, values) + + def test_build_deps_mr11_0_iter_step_5(self): + rc = ReleaseConfig("mr11.0") values = [] - for prj in rc.wanna_build_deps(1): + for prj in rc.wanna_build_deps(4): values.append(prj) - self.assertListEqual(["ngcp-schema"], values) + self.assertListEqual([], values) @patch("build.utils.open_jenkins_url") diff --git a/build/utils.py b/build/utils.py index 9d8777c..c0bf8a5 100644 --- a/build/utils.py +++ b/build/utils.py @@ -173,30 +173,53 @@ def trigger_build( class ReleaseConfig(object): class WannaBuild: - def __init__(self, config, step=1): - self.config = config - self.no_deps = [] - self.deps = [] - self.step = step - build_deps = self.config.build_deps - for name in build_deps.keys(): + def _step_deps(self, level): + no_deps = dict() + deps = dict() + if level == 0: + search_map = self.build_deps + else: + search_map = self.deps[level - 1] + for name in search_map: flag = False - for prj, values in build_deps.items(): + for prj, values in search_map.items(): + if name == prj: + continue if name in values: flag = True - self.deps.append(name) + deps[name] = search_map[name] + logger.debug(f"{name} has dependency on {prj}") break if not flag: - self.no_deps.append(name) + no_deps[name] = search_map[name] + logger.debug(f"** {name} has NO dependency") + self.deps.append(deps) + self.list_deps.append(humansorted(deps.keys())) + self.no_deps.append(no_deps) + self.list_no_deps.append(humansorted(no_deps.keys())) + + def __init__(self, config, step): + self.config = config + self.list_no_deps = [] + self.list_deps = [] + self.no_deps = [] + self.deps = [] + self.step = step + self.build_deps = self.config.build_deps + level = 0 + while self.step - level >= 0: + logger.debug(f"--- level:{level} ---") + self._step_deps(level) + level = level + 1 def __iter__(self): return self def __next__(self): - if self.step == 0: - list_prj = self.no_deps - else: - list_prj = self.deps + try: + list_prj = self.list_no_deps[self.step] + except IndexError: + raise StopIteration if len(list_prj) > 0: return list_prj.pop(0)