def test_property_operator_package_yaml_filename(self):
        nvr = '...irrelevant...'
        stream = '...irrelevant...'
        runtime = type(
            'TestRuntime', (object, ), {
                'image_map': {
                    'my-operator-name':
                    type(
                        'TestImageMetadata', (object, ), {
                            'config': {
                                'update-csv': {
                                    'manifests-dir':
                                    'path/to/operator/manifests/'
                                }
                            }
                        })
                }
            })
        cached_attrs = {
            'working_dir': '/working/dir',
            'operator_name': 'my-operator-name'
        }

        arg = '/working/dir/my-operator-name/path/to/operator/manifests/*package.yaml'
        ret = '/working/dir/my-operator-name/path/to/operator/manifests/my-operator.package.yaml'
        flexmock(operator_metadata.glob).should_receive('glob').with_args(
            arg).and_return([ret])

        self.assertEqual(
            operator_metadata.OperatorMetadataBuilder(
                nvr, stream, runtime,
                **cached_attrs).operator_package_yaml_filename,
            '/working/dir/my-operator-name/path/to/operator/manifests/my-operator.package.yaml'
        )
    def test_property_csv(self):
        metadata_csv_yaml_filename = '/tmp/my-dev-operator-metadata/0.1/my-operator.clusterserviceversion.yaml'
        csv_yaml_file_contents = io.BytesIO(b"""
        metadata:
          name: my-csv
        """)

        (flexmock(operator_metadata.glob).should_receive('glob').with_args(
            '/tmp/my-dev-operator-metadata/manifests/0.1/*.clusterserviceversion.yaml'
        ).and_return([metadata_csv_yaml_filename]))

        mock = flexmock(get_builtin_module())
        mock.should_call('open')
        (mock.should_receive('open').with_args(
            metadata_csv_yaml_filename).and_return(csv_yaml_file_contents))

        nvr = 'my-operator-container-v0.1.2-201901010000'
        stream = 'dev'
        runtime = '...irrelevant...'
        cached_attrs = {
            'working_dir': '/tmp',
            'operator_name': 'my-operator',
        }
        self.assertEqual(
            operator_metadata.OperatorMetadataBuilder(nvr, stream, runtime,
                                                      **cached_attrs).csv,
            'my-csv')
 def test_property_metadata_manifests_dir(self):
     nvr = '...irrelevant...'
     stream = '...irrelevant...'
     runtime = '...irrelevant...'
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(
             nvr, stream, runtime).metadata_manifests_dir, 'manifests')
 def test_property_rhpkg_user_without_runtime_user(self):
     nvr = '...irrelevant...'
     stream = '...irrelevant...'
     runtime = type('TestRuntime', (object, ), {})
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(nvr, stream,
                                                   runtime).rhpkg_user, '')
 def test_property_channel(self):
     nvr = 'my-operator-container-v0.1.2-201901010000'
     stream = '...irrelevant...'
     runtime = '...irrelevant...'
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(nvr, stream,
                                                   runtime).channel, '0.1')
    def test_commit_and_push_metadata_repo_with_rhpkg_user(self):
        sample_dir_obj = operator_metadata.pushd.Dir('/tmp')
        (flexmock(operator_metadata.pushd).should_receive('Dir').with_args(
            '/my/working/dir/my-prod-operator-metadata').replace_with(
                lambda *_: sample_dir_obj))

        (flexmock(operator_metadata.exectools).should_receive(
            'cmd_assert').with_args('git add .').once().replace_with(
                lambda *_: '...irrelevant...'))

        (flexmock(operator_metadata.exectools).should_receive('cmd_assert').
         with_args('rhpkg --user my-user commit -m "Update operator metadata"'
                   ).once().replace_with(lambda *_: '...irrelevant...'))

        (flexmock(operator_metadata.exectools).should_receive(
            'cmd_assert').with_args('timeout 600 rhpkg --user my-user push').
         once().replace_with(lambda *_: '...irrelevant...'))

        nvr = '...irrelevant...'
        stream = 'prod'
        runtime = '...irrelevant...'
        cached_attrs = {
            'working_dir': '/my/working/dir',
            'operator_name': 'my-operator',
            'rhpkg_user': '******'
        }
        (operator_metadata.OperatorMetadataBuilder(
            nvr, stream, runtime,
            **cached_attrs).commit_and_push_metadata_repo())
 def test_property_target(self):
     nvr = '...irrelevant...'
     stream = '...irrelevant...'
     runtime = '...irrelevant...'
     cached_attrs = {'operator_branch': 'my-operator-branch'}
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(nvr, stream, runtime,
                                                   **cached_attrs).target,
         'my-operator-branch-candidate')
 def test_property_working_dir(self):
     nvr = '...irrelevant...'
     stream = '...irrelevant...'
     runtime = type('TestRuntime', (object, ),
                    {'working_dir': '/my/working/dir'})
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(nvr, stream,
                                                   runtime).working_dir,
         '/my/working/dir/distgits/containers')
 def test_property_metadata_repo(self):
     nvr = '...irrelevant...'
     stream = 'dev'
     runtime = '...irrelevant...'
     cached_attrs = {'operator_name': 'my-operator'}
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(
             nvr, stream, runtime, **cached_attrs).metadata_repo,
         'my-dev-operator-metadata')
    def test_get_file_list_from_operator_art_yaml_with_variable_replacement(
            self):
        art_yaml_file_contents = io.BytesIO(b"""
        updates:
          - file: "{MAJOR}.{MINOR}/{OTHERVAR}.clusterserviceversion.yaml"
            update_list:
              - search: foo
                replace: bar
          - file: filename-with-{MINOR}-vars-{OTHERVAR}.yaml
            update_list:
              - search: chunky
                replace: bacon
        """)

        mock = flexmock(get_builtin_module())
        mock.should_call('open')
        (mock.should_receive('open').with_args(
            '/working/dir/my-operator/deploy/olm/manifests/art.yaml').
         and_return(art_yaml_file_contents))

        nvr = '...irrelevant...'
        stream = 'dev'
        runtime = type(
            'TestRuntime', (object, ), {
                'group_config':
                type('', (object, ),
                     {'vars': {
                         'MAJOR': 4,
                         'MINOR': 2,
                         'OTHERVAR': 'other'
                     }}),
            })
        cached_attrs = {
            'working_dir':
            '/working/dir',
            'operator_name':
            'my-operator',
            'operator':
            type(
                '', (object, ), {
                    'config': {
                        'update-csv': {
                            'manifests-dir': 'deploy/olm/manifests/'
                        }
                    }
                })
        }
        op_md = flexmock(
            operator_metadata.OperatorMetadataBuilder(nvr, stream, runtime,
                                                      **cached_attrs),
            metadata_csv_yaml_filename=
            '/working/dir/my-dev-operator-metadata/manifests/4.2/other.clusterserviceversion.yaml'
        )
        self.assertEqual(op_md.get_file_list_from_operator_art_yaml(), [
            '/working/dir/my-dev-operator-metadata/manifests/4.2/other.clusterserviceversion.yaml',
            '/working/dir/my-dev-operator-metadata/manifests/filename-with-2-vars-other.yaml'
        ])
    def test_merge_streams_on_top_level_package_yaml_channel_already_present(
            self):
        package_yaml_filename = '/tmp/my-dev-operator-metadata/manifests/my-operator.package.yaml'
        initial_package_yaml_contents = io.BytesIO(b"""
        channels:
          - name: 4.1
            currentCSV: initial-value
          - name: 4.2
            currentCSV: should-remain-unchanged
        """)

        mock = flexmock(get_builtin_module())
        mock.should_call('open')

        (flexmock(operator_metadata.glob).should_receive('glob').with_args(
            '/tmp/my-dev-operator-metadata/manifests/*package.yaml').
         and_return([package_yaml_filename]))

        (mock.should_receive('open').with_args(
            package_yaml_filename).and_return(initial_package_yaml_contents))

        expected_package_yaml_contents = {
            'channels': [{
                'name': 4.1,
                'currentCSV': 'updated-value'
            }, {
                'name': 4.2,
                'currentCSV': 'should-remain-unchanged'
            }],
            'defaultChannel':
            '4.2'
        }

        (flexmock(operator_metadata.yaml).should_receive('dump').with_args(
            expected_package_yaml_contents
        )  # <-- That's the assertion we are interested
         .replace_with(lambda *_: None))

        (mock.should_receive('open').with_args(
            package_yaml_filename,
            'w').and_return(flexmock(write=lambda *_: None, __exit__=None)))

        nvr = 'my-operator-container-v4.1.2-201901010000'
        stream = 'dev'
        runtime = '...irrelevant...'
        cached_attrs = {
            'working_dir': '/tmp',
            'operator_name': 'my-operator',
            'csv': 'updated-value',
            'operator': type('', (object, ), {'config': {
                'update-csv': {}
            }})
        }
        (operator_metadata.OperatorMetadataBuilder(
            nvr, stream, runtime,
            **cached_attrs).merge_streams_on_top_level_package_yaml())
    def test_property_operator_art_yaml(self):
        art_yaml_file_contents = io.BytesIO(b"""
        updates:
          - file: foo/bar.yaml
            update_list:
              - search: foo
                replace: bar
          - file: chunky/bacon.yaml
            update_list:
              - search: chunky
                replace: bacon
        """)

        mock = flexmock(get_builtin_module())
        mock.should_call('open')
        (mock.should_receive('open').with_args(
            '/working/dir/my-operator/deploy/olm/manifests/art.yaml').
         and_return(art_yaml_file_contents))

        nvr = '...irrelevant...'
        stream = '...irrelevant...'
        runtime = '...irrelevant...'
        cached_attrs = {
            'working_dir':
            '/working/dir',
            'operator_name':
            'my-operator',
            'operator':
            type(
                '', (object, ), {
                    'config': {
                        'update-csv': {
                            'manifests-dir': 'deploy/olm/manifests/'
                        }
                    }
                })
        }
        self.assertEqual(
            operator_metadata.OperatorMetadataBuilder(
                nvr, stream, runtime, **cached_attrs).operator_art_yaml, {
                    'updates':
                    [{
                        'file': 'foo/bar.yaml',
                        'update_list': [{
                            'search': 'foo',
                            'replace': 'bar'
                        }]
                    }, {
                        'file': 'chunky/bacon.yaml',
                        'update_list': [{
                            'search': 'chunky',
                            'replace': 'bacon'
                        }]
                    }]
                })
 def test_property_commit_hash(self):
     nvr = '...irrelevant...'
     stream = '...irrelevant...'
     runtime = '...irrelevant...'
     cached_attrs = {
         'brew_buildinfo': (0, SAMPLE_BREW_BUILDINFO_STDOUT, '')
     }
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(
             nvr, stream, runtime, **cached_attrs).commit_hash,
         'a1b2c3d4e5f6g7h8')
 def test_property_operator_name(self):
     nvr = '...irrelevant...'
     stream = '...irrelevant...'
     runtime = '...irrelevant...'
     cached_attrs = {
         'brew_buildinfo': (0, SAMPLE_BREW_BUILDINFO_STDOUT, '')
     }
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(
             nvr, stream, runtime, **cached_attrs).operator_name,
         'my-operator')
    def test_fetch_image_sha_successfully(self):
        expected_cmd = 'skopeo inspect --raw docker://brew-img-host/brew-img-ns/openshift-my-image'

        (flexmock(operator_metadata.exectools).should_receive(
            'cmd_gather').with_args(expected_cmd).and_return((0, """
            {
                "manifests": [
                    {
                        "digest": "sha256:3781665ddc79c7519d111fdc60fc881a223df8bb1d870a3b8a683d69ee7e7468",
                        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
                        "platform": {
                            "architecture": "ppc64le",
                            "os": "linux"
                        },
                        "size": 1371
                    },
                    {
                        "digest": "sha256:8922dea388e2e41ea30fd54f5f80a3530c5bb746c0136321283dd981b1441015",
                        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
                        "platform": {
                            "architecture": "amd64",
                            "os": "linux"
                        },
                        "size": 1371
                    },
                    {
                        "digest": "sha256:baa138d231382390d24c93300664b767b649bbfd16061fd74a4ad5a18abb9652",
                        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
                        "platform": {
                            "architecture": "s390x",
                            "os": "linux"
                        },
                        "size": 1371
                    }
                ],
                "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
                "schemaVersion": 2
            }
            """, '')))

        nvr = '...irrelevant...'
        stream = '...irrelevant...'
        runtime = flexmock(group_config=flexmock(
            urls=flexmock(brew_image_host="brew-img-host",
                          brew_image_namespace="brew-img-ns"),
            insecure_source=False,
        ))

        op_md = operator_metadata.OperatorMetadataBuilder(nvr, stream, runtime)

        self.assertEqual(
            op_md.fetch_image_sha('openshift/my-image'),
            'sha256:8922dea388e2e41ea30fd54f5f80a3530c5bb746c0136321283dd981b1441015'
        )
    def test_get_brew_buildinfo(self):
        nvr = 'my-operator-container-v0.1.2-201901010000'
        stream = '...irrelevant...'
        runtime = '...irrelevant...'

        (flexmock(operator_metadata.exectools).should_receive(
            'cmd_gather').with_args('brew buildinfo {}'.format(
                nvr)).replace_with(lambda *_: '...irrelevant...'))

        operator_metadata.OperatorMetadataBuilder(
            nvr, stream, runtime).get_brew_buildinfo()
 def test_property_operator_branch(self):
     nvr = '...irrelevant...'
     stream = '...irrelevant...'
     runtime = type(
         'TestRuntime', (object, ), {
             'group_config':
             type('TestGroupConfig', (object, ), {'branch': 'my-branch'})
         })
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(nvr, stream,
                                                   runtime).operator_branch,
         'my-branch')
    def test_get_file_list_from_no_art_yaml(self):
        nvr = '...irrelevant...'
        stream = 'dev'
        runtime = '...irrelevant...'
        op_md = flexmock(
            operator_metadata.OperatorMetadataBuilder(nvr, stream, runtime),
            operator_art_yaml={},
            metadata_csv_yaml_filename='some-file-name',
        )

        self.assertEqual(op_md.get_file_list_from_operator_art_yaml(),
                         ['some-file-name'])
 def test_property_channel_name(self):
     nvr = 'my-operator-container-v0.1.2-201901010000'
     stream = '...irrelevant...'
     runtime = '...irrelevant...'
     cached_attrs = {
         'operator': type('', (object, ), {'config': {
             'update-csv': {}
         }})
     }
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(
             nvr, stream, runtime, **cached_attrs).channel_name, '0.1')
 def test_extract_brew_task_id(self):
     rhpkg_container_build_output = ("""
         Created task: 23233205
         Task info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23233205
     """)
     nvr = '...irrelevant...'
     stream = '...irrelevant...'
     runtime = '...irrelevant...'
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(
             nvr, stream,
             runtime).extract_brew_task_id(rhpkg_container_build_output),
         '23233205')
 def test_property_operator(self):
     nvr = '...irrelevant...'
     stream = '...irrelevant...'
     runtime = type(
         'TestRuntime', (object, ),
         {'image_map': {
             'my-operator-name': 'My Operator Object'
         }})
     cached_attrs = {'operator_name': 'my-operator-name'}
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(nvr, stream, runtime,
                                                   **cached_attrs).operator,
         'My Operator Object')
    def test_update_metadata_manifests_dir_metadata_package_yaml_not_present(
            self):
        (flexmock(operator_metadata.exectools).should_receive(
            'cmd_assert').with_args(
                'rm -rf /tmp/my-dev-operator-metadata/manifests/0.1').once())

        (flexmock(operator_metadata.exectools).should_receive('cmd_assert').
         with_args('mkdir -p /tmp/my-dev-operator-metadata/manifests').once())

        (flexmock(operator_metadata.exectools).should_receive(
            'cmd_assert').with_args(
                ('cp -r '
                 '/tmp/my-operator/path/to/operator/manifests/0.1 '
                 '/tmp/my-dev-operator-metadata/manifests')).once())

        (flexmock(operator_metadata.glob).should_receive('glob').with_args(
            '/tmp/my-dev-operator-metadata/manifests/*package.yaml').
         and_return([]))

        (flexmock(operator_metadata.glob).should_receive('glob').with_args(
            '/tmp/my-operator/path/to/operator/manifests/*package.yaml').
         and_return(['/full/path/to/operator.package.yaml']))

        (flexmock(operator_metadata.exectools).should_receive(
            'cmd_assert').with_args(
                ('cp /full/path/to/operator.package.yaml '
                 '/tmp/my-dev-operator-metadata/manifests')).once())

        nvr = 'my-operator-container-v0.1.2-201901010000'
        stream = 'dev'
        runtime = type(
            'TestRuntime', (object, ), {
                'image_map': {
                    'my-operator':
                    type(
                        'TestImageMetadata', (object, ), {
                            'config': {
                                'update-csv': {
                                    'manifests-dir':
                                    'path/to/operator/manifests/'
                                }
                            }
                        })
                }
            })
        cached_attrs = {'working_dir': '/tmp', 'operator_name': 'my-operator'}
        operator_metadata.OperatorMetadataBuilder(
            nvr, stream, runtime,
            **cached_attrs).update_metadata_manifests_dir()
 def test_property_channel_name_with_override_on_4_2(self):
     nvr = 'my-operator-container-v4.2.2-201901010000'
     stream = '...irrelevant...'
     runtime = '...irrelevant...'
     cached_attrs = {
         'operator':
         type('', (object, ), {
             'config': {
                 'update-csv': {
                     'channel': 'my-custom-channel-name'
                 }
             }
         })
     }
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(
             nvr, stream, runtime, **cached_attrs).channel_name, '4.2')
    def test_no_operator_art_yaml(self):
        md = operator_metadata.OperatorMetadataBuilder(
            nvr='...irrelevant...',
            stream='...irrelevant...',
            runtime='...irrelevant...',
            working_dir='...irrelevant...',
            operator_name='...irrelevant...',
            operator=flexmock(
                config={'update-csv': {
                    'manifests-dir': 'csv-dir'
                }}),
        )
        mock = flexmock(get_builtin_module())
        mock.should_call('open')
        (mock.should_receive('open').and_raise(IOError()))

        self.assertEqual(md.operator_art_yaml, {})
    def test_metadata_package_yaml_does_not_exist(self):
        nvr = '...irrelevant...'
        stream = 'stage'
        runtime = '...irrelevant...'
        cached_attrs = {
            'working_dir': '/working/dir',
            'operator_name': 'my-operator'
        }

        (flexmock(operator_metadata.glob).should_receive('glob').with_args(
            '/working/dir/my-stage-operator-metadata/manifests/*package.yaml').
         and_return([]))

        self.assertFalse(
            operator_metadata.OperatorMetadataBuilder(
                nvr, stream, runtime,
                **cached_attrs).metadata_package_yaml_exists())
 def test_operator_csv_registry(self):
     nvr = '...irrelevant...'
     stream = '...irrelevant...'
     runtime = '...irrelevant...'
     cached_attrs = {
         'operator':
         type('', (object, ), {
             'config': {
                 'update-csv': {
                     'registry': 'my.registry.svc:5000'
                 }
             }
         })
     }
     self.assertEqual(
         operator_metadata.OperatorMetadataBuilder(
             nvr, stream, runtime, **cached_attrs).operator_csv_registry,
         'my.registry.svc:5000')
    def test_checkout_repo(self):
        nvr = '...irrelevant...'
        stream = '...irrelevant...'
        runtime = type('TestRuntime', (object, ), {
            'working_dir': '/my/working/dir',
        })

        sample_dir_obj = operator_metadata.pushd.Dir('/tmp')
        (flexmock(operator_metadata.pushd).should_receive('Dir').with_args(
            '/my/working/dir/distgits/containers/my-repo').replace_with(
                lambda *_: sample_dir_obj))

        (flexmock(operator_metadata.exectools).should_receive(
            'cmd_assert').with_args('git checkout my-hash').replace_with(
                lambda *_: '...irrelevant...'))

        operator_metadata.OperatorMetadataBuilder(nvr, stream,
                                                  runtime).checkout_repo(
                                                      'my-repo', 'my-hash')
    def test_property_metadata_package_yaml_filename(self):
        nvr = '...irrelevant...'
        stream = 'prod'
        runtime = '...irrelevant...'
        cached_attrs = {
            'working_dir': '/working/dir',
            'operator_name': 'my-operator'
        }

        arg = '/working/dir/my-prod-operator-metadata/manifests/*package.yaml'
        ret = '/working/dir/my-prod-operator-metadata/manifests/my-operator.package.yaml'
        flexmock(operator_metadata.glob).should_receive('glob').with_args(
            arg).and_return([ret])

        self.assertEqual(
            operator_metadata.OperatorMetadataBuilder(
                nvr, stream, runtime,
                **cached_attrs).metadata_package_yaml_filename,
            '/working/dir/my-prod-operator-metadata/manifests/my-operator.package.yaml'
        )
    def test_property_metadata_csv_yaml_filename(self):
        nvr = 'my-operator-container-v0.1.2-201901010000'
        stream = 'stage'
        runtime = '...irrelevant...'
        cached_attrs = {
            'working_dir': '/working-dir',
            'operator_name': 'my-operator',
        }

        (flexmock(operator_metadata.glob).should_receive('glob').with_args(
            '/working-dir/my-stage-operator-metadata/manifests/0.1/*.clusterserviceversion.yaml'
        ).and_return([
            '/working-dir/my-stage-operator-metadata/manifests/0.1/my-operator.clusterserviceversion.yaml'
        ]))

        self.assertEqual(
            operator_metadata.OperatorMetadataBuilder(
                nvr, stream, runtime,
                **cached_attrs).metadata_csv_yaml_filename,
            '/working-dir/my-stage-operator-metadata/manifests/0.1/my-operator.clusterserviceversion.yaml'
        )
    def test_clone_repo_with_rhpkg_user(self):
        nvr = '...irrelevant...'
        stream = '...irrelevant...'
        runtime = type('TestRuntime', (object, ), {
            'working_dir': '/my/working/dir',
            'user': '******'
        })

        sample_dir_obj = operator_metadata.pushd.Dir('/tmp')
        (flexmock(operator_metadata.pushd).should_receive('Dir').with_args(
            '/my/working/dir/distgits/containers').replace_with(
                lambda *_: sample_dir_obj))

        (flexmock(
            operator_metadata.exectools
        ).should_receive('cmd_assert').with_args(
            'timeout 600 rhpkg --user my-user clone containers/my-repo --branch my-branch'
        ).replace_with(lambda *_: '...irrelevant...'))

        operator_metadata.OperatorMetadataBuilder(nvr, stream,
                                                  runtime).clone_repo(
                                                      'my-repo', 'my-branch')