Skip to content

Commit 279f211

Browse files
Add internal_index_image_copy and internal_index_image_copy_resolved attributes
Added attributes to response of Add and Rm requests. Their values will be the pullspec pointing to the default IIB output repo. The values will be same as that of index_image and index_image_resolved respectively when overwrite_from_index is NOT provided when submitting the request. Refers to CLOUDDST-13288
1 parent fb23b73 commit 279f211

7 files changed

Lines changed: 168 additions & 1 deletion

File tree

iib/web/api_v1.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,8 @@ def patch_request(request_id):
554554
'from_index_resolved',
555555
'index_image',
556556
'index_image_resolved',
557+
'internal_index_image_copy',
558+
'internal_index_image_copy_resolved',
557559
'source_from_index_resolved',
558560
'target_index_resolved',
559561
)
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
"""Add internal_index_image_copy to Add and Rm.
2+
3+
Revision ID: 3283f52e7329
4+
Revises: 5188702409d9
5+
Create Date: 2022-06-10 01:41:18.583209
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
11+
12+
# revision identifiers, used by Alembic.
13+
revision = '3283f52e7329'
14+
down_revision = '5188702409d9'
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
with op.batch_alter_table('request_add', schema=None) as batch_op:
21+
batch_op.add_column(sa.Column('internal_index_image_copy_id', sa.Integer(), nullable=True))
22+
batch_op.add_column(
23+
sa.Column('internal_index_image_copy_resolved_id', sa.Integer(), nullable=True)
24+
)
25+
batch_op.create_foreign_key(
26+
"internal_index_image_copy_id_fkey", 'image', ['internal_index_image_copy_id'], ['id']
27+
)
28+
batch_op.create_foreign_key(
29+
"internal_index_image_copy_resolved_id_fkey",
30+
'image',
31+
['internal_index_image_copy_resolved_id'],
32+
['id'],
33+
)
34+
35+
with op.batch_alter_table('request_create_empty_index', schema=None) as batch_op:
36+
batch_op.add_column(sa.Column('internal_index_image_copy_id', sa.Integer(), nullable=True))
37+
batch_op.add_column(
38+
sa.Column('internal_index_image_copy_resolved_id', sa.Integer(), nullable=True)
39+
)
40+
batch_op.create_foreign_key(
41+
"internal_index_image_copy_id_fkey", 'image', ['internal_index_image_copy_id'], ['id']
42+
)
43+
batch_op.create_foreign_key(
44+
"internal_index_image_copy_resolved_id_fkey",
45+
'image',
46+
['internal_index_image_copy_resolved_id'],
47+
['id'],
48+
)
49+
50+
with op.batch_alter_table('request_rm', schema=None) as batch_op:
51+
batch_op.add_column(sa.Column('internal_index_image_copy_id', sa.Integer(), nullable=True))
52+
batch_op.add_column(
53+
sa.Column('internal_index_image_copy_resolved_id', sa.Integer(), nullable=True)
54+
)
55+
batch_op.create_foreign_key(
56+
"internal_index_image_copy_resolved_id_fkey",
57+
'image',
58+
['internal_index_image_copy_resolved_id'],
59+
['id'],
60+
)
61+
batch_op.create_foreign_key(
62+
"internal_index_image_copy_id_fkey", 'image', ['internal_index_image_copy_id'], ['id']
63+
)
64+
65+
66+
def downgrade():
67+
with op.batch_alter_table('request_rm', schema=None) as batch_op:
68+
batch_op.drop_constraint("internal_index_image_copy_resolved_id_fkey", type_='foreignkey')
69+
batch_op.drop_constraint("internal_index_image_copy_id_fkey", type_='foreignkey')
70+
batch_op.drop_column('internal_index_image_copy_resolved_id')
71+
batch_op.drop_column('internal_index_image_copy_id')
72+
73+
with op.batch_alter_table('request_create_empty_index', schema=None) as batch_op:
74+
batch_op.drop_constraint("internal_index_image_copy_resolved_id_fkey", type_='foreignkey')
75+
batch_op.drop_constraint("internal_index_image_copy_id_fkey", type_='foreignkey')
76+
batch_op.drop_column('internal_index_image_copy_resolved_id')
77+
batch_op.drop_column('internal_index_image_copy_id')
78+
79+
with op.batch_alter_table('request_add', schema=None) as batch_op:
80+
batch_op.drop_constraint("internal_index_image_copy_resolved_id_fkey", type_='foreignkey')
81+
batch_op.drop_constraint("internal_index_image_copy_id_fkey", type_='foreignkey')
82+
batch_op.drop_column('internal_index_image_copy_resolved_id')
83+
batch_op.drop_column('internal_index_image_copy_id')

iib/web/models.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,8 @@ def get_request_query_options(verbose=False):
683683
joinedload(RequestAdd.from_index_resolved),
684684
joinedload(RequestAdd.index_image),
685685
joinedload(RequestAdd.index_image_resolved),
686+
joinedload(RequestAdd.internal_index_image_copy),
687+
joinedload(RequestAdd.internal_index_image_copy_resolved),
686688
joinedload(RequestAdd.build_tags),
687689
joinedload(RequestRegenerateBundle.bundle_image),
688690
joinedload(RequestRegenerateBundle.from_bundle_image),
@@ -693,6 +695,8 @@ def get_request_query_options(verbose=False):
693695
joinedload(RequestRm.from_index_resolved),
694696
joinedload(RequestRm.index_image),
695697
joinedload(RequestRm.index_image_resolved),
698+
joinedload(RequestRm.internal_index_image_copy),
699+
joinedload(RequestRm.internal_index_image_copy_resolved),
696700
joinedload(RequestRm.operators),
697701
joinedload(RequestRm.build_tags),
698702
joinedload(RequestMergeIndexImage.build_tags),
@@ -773,6 +777,30 @@ def index_image_resolved(cls):
773777
"""Return the relationship to the built index image."""
774778
return db.relationship('Image', foreign_keys=[cls.index_image_resolved_id], uselist=False)
775779

780+
@declared_attr
781+
def internal_index_image_copy_id(cls):
782+
"""Return the ID of IIB's internal copy of the built index image."""
783+
return db.Column(db.Integer, db.ForeignKey('image.id'))
784+
785+
@declared_attr
786+
def internal_index_image_copy(cls):
787+
"""Return the relationship to IIB's internal copy of the built index image."""
788+
return db.relationship(
789+
'Image', foreign_keys=[cls.internal_index_image_copy_id], uselist=False
790+
)
791+
792+
@declared_attr
793+
def internal_index_image_copy_resolved_id(cls):
794+
"""Return the ID of resolved IIB's internal copy of the built index image."""
795+
return db.Column(db.Integer, db.ForeignKey('image.id'))
796+
797+
@declared_attr
798+
def internal_index_image_copy_resolved(cls):
799+
"""Return the relationship to resolved IIB's internal copy of the built index image."""
800+
return db.relationship(
801+
'Image', foreign_keys=[cls.internal_index_image_copy_resolved_id], uselist=False
802+
)
803+
776804
@declared_attr
777805
def distribution_scope(cls):
778806
"""Return the distribution_scope for the request."""
@@ -907,6 +935,12 @@ def get_common_index_image_json(self):
907935
'from_index_resolved': getattr(self.from_index_resolved, 'pull_specification', None),
908936
'index_image': getattr(self.index_image, 'pull_specification', None),
909937
'index_image_resolved': getattr(self.index_image_resolved, 'pull_specification', None),
938+
'internal_index_image_copy': getattr(
939+
self.internal_index_image_copy, 'pull_specification', None
940+
),
941+
'internal_index_image_copy_resolved': getattr(
942+
self.internal_index_image_copy_resolved, 'pull_specification', None
943+
),
910944
'organization': None,
911945
'removed_operators': [],
912946
'distribution_scope': self.distribution_scope,
@@ -928,6 +962,8 @@ def get_index_image_mutable_keys(self):
928962
'from_index_resolved',
929963
'index_image',
930964
'index_image_resolved',
965+
'internal_index_image_copy',
966+
'internal_index_image_copy_resolved',
931967
}
932968

933969

@@ -1639,6 +1675,8 @@ def to_json(self, verbose=True):
16391675
rv.pop('deprecation_list')
16401676
rv.pop('removed_operators')
16411677
rv.pop('build_tags')
1678+
rv.pop('internal_index_image_copy')
1679+
rv.pop('internal_index_image_copy_resolved')
16421680
rv['labels'] = self.labels
16431681
return rv
16441682

@@ -1653,4 +1691,6 @@ def get_mutable_keys(self):
16531691
rv.update(self.get_index_image_mutable_keys())
16541692
rv.update('labels')
16551693
rv.remove('from_bundle_image_resolved')
1694+
rv.remove('internal_index_image_copy')
1695+
rv.remove('internal_index_image_copy_resolved')
16561696
return rv

iib/web/static/api_v1.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,20 @@ components:
784784
index_image_resolved:
785785
type: string
786786
example: 'quay.io/iib-stage/iib@sha256:abcdef012356789'
787+
internal_index_image_copy:
788+
description: >
789+
The pullspec of the internal copy of the index image built by IIB.
790+
It will have the same value as index_image when overwrite_from_index
791+
is not provided.
792+
type: string
793+
example: 'quay.io/iib-stage/iib:5'
794+
internal_index_image_copy_resolved:
795+
description: >
796+
The resolved pullspec of the internal copy of the index image built by IIB.
797+
It will have the same value as index_image_resolved when overwrite_from_index
798+
is not provided.
799+
type: string
800+
example: 'quay.io/iib-stage/iib@sha256:abcdef012356789'
787801
distribution_scope:
788802
description: >
789803
The scope of distribution for the index created by the request.

iib/workers/tasks/build.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ def _update_index_image_pull_spec(
243243
with set_registry_token(overwrite_from_index_token, index_image):
244244
index_image_resolved = get_resolved_image(index_image)
245245
payload['index_image_resolved'] = index_image_resolved
246+
payload['internal_index_image_copy'] = output_pull_spec
247+
payload['internal_index_image_copy_resolved'] = get_resolved_image(output_pull_spec)
246248

247249
update_request(request_id, payload, exc_msg='Failed setting the index image on the request')
248250

tests/test_web/test_api_v1.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ def test_get_build(app, auth_env, client, db):
2727
'quay.io/namespace/from_index@sha256:defghi'
2828
)
2929
request.index_image = Image.get_or_create('quay.io/namespace/index@sha256:fghijk')
30+
request.internal_index_image_copy = Image.get_or_create(
31+
'quay.io/namespace/internal_index:tag'
32+
)
33+
request.internal_index_image_copy_resolved = Image.get_or_create(
34+
'quay.io/namespace/internal_index@sha256:something'
35+
)
3036
request.add_architecture('amd64')
3137
request.add_architecture('s390x')
3238
request.add_state('complete', 'Completed successfully')
@@ -57,6 +63,8 @@ def test_get_build(app, auth_env, client, db):
5763
'id': 1,
5864
'index_image': 'quay.io/namespace/index@sha256:fghijk',
5965
'index_image_resolved': None,
66+
'internal_index_image_copy': 'quay.io/namespace/internal_index:tag',
67+
'internal_index_image_copy_resolved': 'quay.io/namespace/internal_index@sha256:something',
6068
'logs': {
6169
'url': 'http://localhost/api/v1/builds/1/logs',
6270
'expiration': '2020-02-15T17:03:00Z',
@@ -680,6 +688,8 @@ def test_add_bundle_success(
680688
'id': 1,
681689
'index_image': None,
682690
'index_image_resolved': None,
691+
'internal_index_image_copy': None,
692+
'internal_index_image_copy_resolved': None,
683693
'removed_operators': [],
684694
'request_type': 'add',
685695
'state': 'in_progress',
@@ -989,6 +999,8 @@ def test_patch_request_add_success(
989999
'index_image': 'index:image',
9901000
'index_image_resolved': 'index:image-resolved',
9911001
'binary_image_resolved': 'binary-image@sha256:1234',
1002+
'internal_index_image_copy': 'quay.io/namespace/internal_index:tag',
1003+
'internal_index_image_copy_resolved': 'quay.io/namespace/internal_index@sha256:something',
9921004
}
9931005

9941006
if distribution_scope:
@@ -1010,6 +1022,8 @@ def test_patch_request_add_success(
10101022
'id': minimal_request_add.id,
10111023
'index_image': 'index:image',
10121024
'index_image_resolved': 'index:image-resolved',
1025+
'internal_index_image_copy': 'quay.io/namespace/internal_index:tag',
1026+
'internal_index_image_copy_resolved': 'quay.io/namespace/internal_index@sha256:something',
10131027
'logs': {
10141028
'url': 'http://localhost/api/v1/builds/1/logs',
10151029
'expiration': '2020-02-15T17:03:00Z',
@@ -1059,6 +1073,8 @@ def test_patch_request_rm_success(mock_smfsc, db, minimal_request_rm, worker_aut
10591073
'index_image': 'index:image',
10601074
'index_image_resolved': 'index:image-resolved',
10611075
'binary_image_resolved': 'binary-image@sha256:1234',
1076+
'internal_index_image_copy': 'quay.io/namespace/internal_index:tag',
1077+
'internal_index_image_copy_resolved': 'quay.io/namespace/internal_index@sha256:something',
10621078
}
10631079

10641080
response_json = {
@@ -1077,6 +1093,8 @@ def test_patch_request_rm_success(mock_smfsc, db, minimal_request_rm, worker_aut
10771093
'id': minimal_request_rm.id,
10781094
'index_image': 'index:image',
10791095
'index_image_resolved': 'index:image-resolved',
1096+
'internal_index_image_copy': 'quay.io/namespace/internal_index:tag',
1097+
'internal_index_image_copy_resolved': 'quay.io/namespace/internal_index@sha256:something',
10801098
'logs': {
10811099
'url': 'http://localhost/api/v1/builds/1/logs',
10821100
'expiration': '2020-02-15T17:03:00Z',
@@ -1204,6 +1222,8 @@ def test_remove_operator_success(mock_smfsc, mock_rm, db, auth_env, client):
12041222
'id': 1,
12051223
'index_image': None,
12061224
'index_image_resolved': None,
1225+
'internal_index_image_copy': None,
1226+
'internal_index_image_copy_resolved': None,
12071227
'logs': {
12081228
'url': 'http://localhost/api/v1/builds/1/logs',
12091229
'expiration': '2020-02-15T17:03:00Z',

tests/test_workers/test_tasks/test_build.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,13 @@ def test_update_index_image_pull_spec(
260260
mock_ur.assert_called_once()
261261
update_request_payload = mock_ur.call_args[0][1]
262262
if add_or_rm:
263-
assert update_request_payload.keys() == {'arches', 'index_image', 'index_image_resolved'}
263+
assert update_request_payload.keys() == {
264+
'arches',
265+
'index_image',
266+
'index_image_resolved',
267+
'internal_index_image_copy',
268+
'internal_index_image_copy_resolved',
269+
}
264270
else:
265271
assert update_request_payload.keys() == {'arches', 'index_image'}
266272
assert update_request_payload['index_image'] == expected_pull_spec

0 commit comments

Comments
 (0)