Skip to content

Commit 2892b9a

Browse files
lipojayashvardhannanavati
authored andcommitted
Enable a containerized version of the ADD API endpoint
[CLOUDDST-28643]
1 parent 5d33e97 commit 2892b9a

File tree

4 files changed

+64
-84
lines changed

4 files changed

+64
-84
lines changed

iib/web/api_v1.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444
from iib.web.s3_utils import get_object_from_s3_bucket
4545
from botocore.response import StreamingBody
4646
from iib.web.utils import pagination_metadata, str_to_bool
47-
from iib.workers.tasks.build import (
48-
handle_add_request,
47+
from iib.workers.tasks.build_containerized_add import (
48+
handle_containerized_add_request,
4949
)
5050
from iib.workers.tasks.build_containerized_rm import handle_containerized_rm_request
5151
from iib.workers.tasks.build_add_deprecations import handle_add_deprecations_request
@@ -131,13 +131,9 @@ def _get_add_args(
131131
payload.get('binary_image'),
132132
payload.get('from_index'),
133133
payload.get('add_arches'),
134-
payload.get('cnr_token'),
135-
payload.get('organization'),
136-
payload.get('force_backport'),
137134
overwrite_from_index,
138135
payload.get('overwrite_from_index_token'),
139136
request.distribution_scope,
140-
flask.current_app.config['IIB_GREENWAVE_CONFIG'].get(celery_queue),
141137
flask.current_app.config['IIB_BINARY_IMAGE_CONFIG'],
142138
payload.get('deprecation_list', []),
143139
payload.get('build_tags', []),
@@ -601,6 +597,9 @@ def add_bundles() -> Tuple[flask.Response, int]:
601597
if not isinstance(payload, dict):
602598
raise ValidationError('The input data must be a JSON object')
603599

600+
if not payload.get('from_index'):
601+
raise ValidationError('The input "from_index" is required.')
602+
604603
# Only run `_get_unique_bundles` if it is a list. If it's not, `from_json`
605604
# will raise an error to the user.
606605
if payload.get('bundles') and isinstance(payload['bundles'], list):
@@ -623,7 +622,7 @@ def add_bundles() -> Tuple[flask.Response, int]:
623622
args.append(current_user.username)
624623

625624
try:
626-
handle_add_request.apply_async(
625+
handle_containerized_add_request.apply_async(
627626
args=args,
628627
link_error=error_callback,
629628
argsrepr=repr(safe_args),
@@ -1074,7 +1073,7 @@ def add_rm_batch() -> Tuple[flask.Response, int]:
10741073
error_callback = failed_request_callback.s(request.id)
10751074
try:
10761075
if isinstance(request, RequestAdd):
1077-
handle_add_request.apply_async(
1076+
handle_containerized_add_request.apply_async(
10781077
args=args,
10791078
link_error=error_callback,
10801079
argsrepr=repr(safe_args),

iib/workers/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ class Config(object):
9494
'iib.workers.tasks.build_create_empty_index',
9595
'iib.workers.tasks.build_fbc_operations',
9696
'iib.workers.tasks.build_add_deprecations',
97+
'iib.workers.tasks.build_containerized_add',
9798
'iib.workers.tasks.build_containerized_fbc_operations',
9899
'iib.workers.tasks.build_containerized_rm',
99100
'iib.workers.tasks.build_containerized_create_empty_index',

tests/test_web/test_api_v1.py

Lines changed: 52 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -513,23 +513,39 @@ def test_get_build_logs_s3_configured(
513513
'The "overwrite_from_index_token" parameter must be a string',
514514
),
515515
(
516-
{'bundles': ['some:thing'], 'binary_image': 'binary:image', 'cnr_token': True},
517-
'"cnr_token" must be a string',
518-
),
519-
(
520-
{'bundles': ['some:thing'], 'binary_image': 'binary:image', 'organization': True},
516+
{
517+
'from_index': 'pull:spec',
518+
'bundles': ['some:thing'],
519+
'binary_image': 'binary:image',
520+
'organization': True,
521+
},
521522
'"organization" must be a string',
522523
),
523524
(
524-
{'bundles': ['some:thing'], 'binary_image': 'binary:image', 'force_backport': 'spam'},
525+
{
526+
'from_index': 'pull:spec',
527+
'bundles': ['some:thing'],
528+
'binary_image': 'binary:image',
529+
'force_backport': 'spam',
530+
},
525531
'"force_backport" must be a boolean',
526532
),
527533
(
528-
{'bundles': ['some:thing'], 'binary_image': 'binary:image', 'graph_update_mode': 123},
534+
{
535+
'from_index': 'pull:spec',
536+
'bundles': ['some:thing'],
537+
'binary_image': 'binary:image',
538+
'graph_update_mode': 123,
539+
},
529540
'"graph_update_mode" must be a string',
530541
),
531542
(
532-
{'bundles': ['some:thing'], 'binary_image': 'binary:image', 'graph_update_mode': 'Hi'},
543+
{
544+
'from_index': 'pull:spec',
545+
'bundles': ['some:thing'],
546+
'binary_image': 'binary:image',
547+
'graph_update_mode': 'Hi',
548+
},
533549
(
534550
'"graph_update_mode" must be set to one of these: [\'replaces\', \'semver\''
535551
', \'semver-skippatch\']'
@@ -560,7 +576,7 @@ def test_add_bundles_overwrite_not_allowed(mock_smfsc, client, db):
560576
mock_smfsc.assert_not_called()
561577

562578

563-
@pytest.mark.parametrize('from_index', (None, 'some-random-index:v4.14', 'some-common-index:v4.15'))
579+
@pytest.mark.parametrize('from_index', ('some-random-index:v4.14', 'some-common-index:v4.15'))
564580
@mock.patch('iib.web.api_v1.messaging.send_message_for_state_change')
565581
def test_add_bundles_graph_update_mode_not_allowed(
566582
mock_smfsc, app, client, auth_env, db, from_index
@@ -587,7 +603,7 @@ def test_add_bundles_graph_update_mode_not_allowed(
587603

588604
@pytest.mark.parametrize('from_index', ('some-common-index:v4.15', 'another-common-index:v4.15'))
589605
@mock.patch('iib.web.api_v1.messaging.send_message_for_state_change')
590-
@mock.patch('iib.web.api_v1.handle_add_request')
606+
@mock.patch('iib.web.api_v1.handle_containerized_add_request')
591607
def test_add_bundles_graph_update_mode_allowed(
592608
mock_har, mock_smfsc, app, client, auth_env, db, from_index
593609
):
@@ -611,7 +627,7 @@ def test_add_bundles_graph_update_mode_allowed(
611627
@mock.patch('iib.web.api_v1.db.session')
612628
@mock.patch('iib.web.api_v1.flask.jsonify')
613629
@mock.patch('iib.web.api_v1.RequestAdd')
614-
@mock.patch('iib.web.api_v1.handle_add_request.apply_async')
630+
@mock.patch('iib.web.api_v1.handle_containerized_add_request.apply_async')
615631
@mock.patch('iib.web.api_v1.messaging.send_message_for_state_change')
616632
def test_add_bundles_unique_bundles(mock_smfsc, mock_har, mock_radd, mock_fj, mock_dbs, client):
617633
data = {
@@ -690,15 +706,16 @@ def test_rm_operators_overwrite_not_allowed(mock_smfsc, client, db):
690706
),
691707
(
692708
{'add_arches': ['s390x'], 'binary_image': 'binary:image'},
693-
'"from_index" must be specified if no bundles are specified',
709+
'The input "from_index" is required.',
694710
),
695-
({'add_arches': ['s390x']}, '"from_index" must be specified if no bundles are specified'),
711+
({'add_arches': ['s390x']}, 'The input "from_index" is required.'),
696712
(
697713
{
698714
'bundles': ['some:thing'],
699715
'binary_image': 'binary:image',
700716
'add_arches': ['s390x'],
701717
'overwrite_from_index_token': 'username:password',
718+
'from_index': 'pull:spec',
702719
},
703720
(
704721
'The "overwrite_from_index" parameter is required when the '
@@ -758,6 +775,7 @@ def test_add_bundle_invalid_param(mock_smfsc, db, auth_env, client):
758775
'best_batsman': 'Virat Kohli',
759776
'binary_image': 'binary:image',
760777
'bundles': ['some:thing'],
778+
'from_index': 'pull:spec',
761779
}
762780

763781
rv = client.post('/api/v1/builds/add', json=data, environ_base=auth_env)
@@ -802,16 +820,6 @@ def test_rm_bundle_from_invalid_distribution_scope(mock_smfsc, db, auth_env, cli
802820
mock_smfsc.assert_not_called()
803821

804822

805-
@mock.patch('iib.web.api_v1.messaging.send_message_for_state_change')
806-
def test_add_bundle_from_index_and_add_arches_missing(mock_smfsc, db, auth_env, client):
807-
data = {'bundles': ['some:thing'], 'binary_image': 'binary:image'}
808-
809-
rv = client.post('/api/v1/builds/add', json=data, environ_base=auth_env)
810-
assert rv.status_code == 400
811-
assert rv.json['error'] == 'One of "from_index" or "add_arches" must be specified'
812-
mock_smfsc.assert_not_called()
813-
814-
815823
@pytest.mark.parametrize(
816824
(
817825
'binary_image',
@@ -823,14 +831,14 @@ def test_add_bundle_from_index_and_add_arches_missing(mock_smfsc, db, auth_env,
823831
'graph_update_mode',
824832
),
825833
(
826-
('binary:image', False, None, ['some:thing'], None, None, None),
834+
('binary:image', False, None, ['some:thing'], 'some:thing', None, None),
827835
('binary:image', False, None, ['some:thing'], 'some:thing', None, 'semver'),
828836
('binary:image', False, None, [], 'some:thing', 'Prod', 'semver-skippatch'),
829837
('scratch', True, 'username:password', ['some:thing'], 'some:thing', 'StagE', 'replaces'),
830838
('scratch', True, 'username:password', [], 'some:thing', 'DeV', 'semver'),
831839
),
832840
)
833-
@mock.patch('iib.web.api_v1.handle_add_request')
841+
@mock.patch('iib.web.api_v1.handle_containerized_add_request')
834842
@mock.patch('iib.web.api_v1.messaging.send_message_for_state_change')
835843
def test_add_bundle_success(
836844
mock_smfsc,
@@ -851,8 +859,6 @@ def test_add_bundle_success(
851859
data = {
852860
'binary_image': binary_image,
853861
'add_arches': ['s390x'],
854-
'organization': 'org',
855-
'cnr_token': 'token',
856862
'overwrite_from_index': overwrite_from_index,
857863
'overwrite_from_index_token': overwrite_from_index_token,
858864
'from_index': from_index,
@@ -898,7 +904,7 @@ def test_add_bundle_success(
898904
'expiration': '2020-02-15T17:03:00Z',
899905
},
900906
'omps_operator_version': {},
901-
'organization': 'org',
907+
'organization': None,
902908
'state_history': [
903909
{
904910
'state': 'in_progress',
@@ -918,31 +924,12 @@ def test_add_bundle_success(
918924
rv_json['logs']['expiration'] = '2020-02-15T17:03:00Z'
919925
assert rv.status_code == 201
920926
assert response_json == rv_json
921-
assert 'cnr_token' not in rv_json
922927
assert 'token' not in mock_har.apply_async.call_args[1]['argsrepr']
923-
assert '*****' in mock_har.apply_async.call_args[1]['argsrepr']
924928
mock_har.apply_async.assert_called_once()
925929
mock_smfsc.assert_called_once_with(mock.ANY, new_batch_msg=True)
926930

927931

928-
@pytest.mark.parametrize('force_backport', (False, True))
929-
@mock.patch('iib.web.api_v1.handle_add_request')
930-
def test_add_bundle_force_backport(mock_har, force_backport, db, auth_env, client):
931-
data = {
932-
'bundles': ['some:thing'],
933-
'binary_image': 'binary:image',
934-
'from_index': 'index:image',
935-
'force_backport': force_backport,
936-
}
937-
938-
rv = client.post('/api/v1/builds/add', json=data, environ_base=auth_env)
939-
assert rv.status_code == 201
940-
mock_har.apply_async.assert_called_once()
941-
# Eigth element in args is the force_backport parameter
942-
assert mock_har.apply_async.call_args[1]['args'][7] == force_backport
943-
944-
945-
@mock.patch('iib.web.api_v1.handle_add_request')
932+
@mock.patch('iib.web.api_v1.handle_containerized_add_request')
946933
@mock.patch('iib.web.api_v1.messaging.send_message_for_state_change')
947934
def test_add_bundle_overwrite_token_redacted(mock_smfsc, mock_har, app, auth_env, client, db):
948935
token = 'username:password'
@@ -952,20 +939,20 @@ def test_add_bundle_overwrite_token_redacted(mock_smfsc, mock_har, app, auth_env
952939
'add_arches': ['amd64'],
953940
'overwrite_from_index': True,
954941
'overwrite_from_index_token': token,
942+
'from_index': 'pull:spec',
955943
}
956944

957945
rv = client.post('/api/v1/builds/add', json=data, environ_base=auth_env)
958946
rv_json = rv.json
959947
assert rv.status_code == 201
960948
mock_har.apply_async.assert_called_once()
961949
# Tenth to last element in args is the overwrite_from_index parameter
962-
assert mock_har.apply_async.call_args[1]['args'][-11] is True
950+
assert mock_har.apply_async.call_args[1]['args'][-10] is True
963951
# Ninth to last element in args is the overwrite_from_index_token parameter
964-
assert mock_har.apply_async.call_args[1]['args'][-10] == token
952+
assert mock_har.apply_async.call_args[1]['args'][-9] == token
965953
assert 'overwrite_from_index_token' not in rv_json
966954
assert token not in json.dumps(rv_json)
967955
assert token not in mock_har.apply_async.call_args[1]['argsrepr']
968-
assert '*****' in mock_har.apply_async.call_args[1]['argsrepr']
969956

970957

971958
@pytest.mark.parametrize(
@@ -1002,13 +989,18 @@ def test_add_bundle_overwrite_token_redacted(mock_smfsc, mock_har, app, auth_env
1002989
({'[email protected]': 'Patriots'}, True, None),
1003990
),
1004991
)
1005-
@mock.patch('iib.web.api_v1.handle_add_request')
992+
@mock.patch('iib.web.api_v1.handle_containerized_add_request')
1006993
@mock.patch('iib.web.api_v1.messaging.send_message_for_state_change')
1007994
def test_add_bundle_custom_user_queue(
1008995
mock_smfsc, mock_har, app, auth_env, client, user_to_queue, overwrite_from_index, expected_queue
1009996
):
1010997
app.config['IIB_USER_TO_QUEUE'] = user_to_queue
1011-
data = {'bundles': ['some:thing'], 'binary_image': 'binary:image', 'add_arches': ['s390x']}
998+
data = {
999+
'bundles': ['some:thing'],
1000+
'binary_image': 'binary:image',
1001+
'add_arches': ['s390x'],
1002+
'from_index': 'pull:spec',
1003+
}
10121004
if overwrite_from_index:
10131005
data['from_index'] = 'index:image'
10141006
data['overwrite_from_index'] = True
@@ -1820,7 +1812,7 @@ def test_regenerate_bundle_batch_invalid_input(payload, error_msg, app, auth_env
18201812
assert rv.json == {'error': error_msg}
18211813

18221814

1823-
@mock.patch('iib.web.api_v1.handle_add_request')
1815+
@mock.patch('iib.web.api_v1.handle_containerized_add_request')
18241816
@mock.patch('iib.web.api_v1.handle_containerized_rm_request')
18251817
@mock.patch('iib.web.api_v1.messaging.send_messages_for_new_batch_of_requests')
18261818
@mock.patch.dict('iib.web.api_v1.flask.current_app.config', {'IIB_INDEX_TO_GITLAB_PUSH_MAP': {}})
@@ -1834,8 +1826,6 @@ def test_add_rm_batch_success(mock_smfnbor, mock_hrr, mock_har, app, auth_env, c
18341826
'binary_image': 'registry-proxy/rh-osbs/openshift-ose-operator-registry:v4.5',
18351827
'from_index': 'registry-proxy/rh-osbs-stage/iib:v4.5',
18361828
'add_arches': ['amd64'],
1837-
'cnr_token': 'no_tom_brady_anymore',
1838-
'organization': 'hello-operator',
18391829
'overwrite_from_index': True,
18401830
'overwrite_from_index_token': 'some_token',
18411831
},
@@ -1860,13 +1850,9 @@ def test_add_rm_batch_success(mock_smfnbor, mock_hrr, mock_har, app, auth_env, c
18601850
'registry-proxy/rh-osbs/openshift-ose-operator-registry:v4.5',
18611851
'registry-proxy/rh-osbs-stage/iib:v4.5',
18621852
['amd64'],
1863-
'no_tom_brady_anymore',
1864-
'hello-operator',
1865-
None,
18661853
True,
18671854
'some_token',
18681855
None,
1869-
None,
18701856
{},
18711857
[],
18721858
[],
@@ -1875,11 +1861,10 @@ def test_add_rm_batch_success(mock_smfnbor, mock_hrr, mock_har, app, auth_env, c
18751861
{}, # index_to_gitlab_push_map from config (empty in test)
18761862
],
18771863
argsrepr=(
1878-
"[['registry-proxy/rh-osbs/lgallett-bundle:v1.0-9'], "
1879-
"1, 'registry-proxy/rh-osbs/openshift-ose-operator-registry:v4.5', "
1880-
"'registry-proxy/rh-osbs-stage/iib:v4.5', ['amd64'], '*****', "
1881-
"'hello-operator', None, True, '*****', None, None, {}, [], [], None, "
1882-
"False, {}]"
1864+
"[['registry-proxy/rh-osbs/lgallett-bundle:v1.0-9'], 1, "
1865+
"'registry-proxy/rh-osbs/openshift-ose-operator-registry:v4.5', "
1866+
"'registry-proxy/rh-osbs-stage/iib:v4.5', ['amd64'], True, '*****', "
1867+
"None, {}, [], [], None, False, {}]"
18831868
),
18841869
link_error=mock.ANY,
18851870
queue=None,
@@ -1904,8 +1889,8 @@ def test_add_rm_batch_success(mock_smfnbor, mock_hrr, mock_har, app, auth_env, c
19041889
],
19051890
argsrepr=(
19061891
"[['kiali-ossm'], 2, 'registry:8443/iib-build:11', "
1907-
"'registry-proxy/rh-osbs/openshift-ose-operator-registry:v4.5'"
1908-
", None, False, None, None, {}, [], {}]"
1892+
"'registry-proxy/rh-osbs/openshift-ose-operator-registry:v4.5', "
1893+
"None, False, None, None, {}, [], {}]"
19091894
),
19101895
link_error=mock.ANY,
19111896
queue=None,

0 commit comments

Comments
 (0)