Beispiel #1
0
    def test_framework_registration(self, mock_store):
        """
        Makes sure the framework is registered correctly.
        """
        # Version this is a dependency.
        dependency = mock_store.add_framework("tk-framework-dependency",
                                              "v1.0.0")
        self.assertEqual(
            dependency.get_major_dependency_descriptor(),
            {
                "version": "v1.x.x",
                "name": "tk-framework-dependency",
                "type": "app_store",
            },
        )
        # This is V1 of a framework that has no depdendencies.
        mock_store.add_framework("tk-framework-main", "v1.0.0")
        # This is V2 of a framework that now has a depdendency
        mock_store.add_framework(
            "tk-framework-main", "v2.0.0").required_frameworks = [
                dependency.get_major_dependency_descriptor()
            ]

        # Makes sure we respect the interface of the TankAppStoreDescriptor

        desc = create_descriptor(
            None,
            Descriptor.FRAMEWORK,
            {
                "name": "tk-framework-main",
                "version": "v2.0.0",
                "type": "app_store"
            },
        )

        self.assertEqual(
            desc.required_frameworks,
            [{
                "type": "app_store",
                "name": "tk-framework-dependency",
                "version": "v1.x.x",
            }],
        )

        desc = create_descriptor(
            None,
            Descriptor.FRAMEWORK,
            {
                "name": "tk-framework-main",
                "version": "v1.0.0",
                "type": "app_store"
            },
        )

        self.assertEqual(desc.required_frameworks, [])
Beispiel #2
0
    def test_framework_registration(self, mock_store):
        """
        Makes sure the framework is registered correctly.
        """
        # Version this is a dependency.
        dependency = mock_store.add_framework("tk-framework-dependency", "v1.0.0")
        self.assertEqual(dependency.get_major_dependency_descriptor(), {
            "version": "v1.x.x",
            "name": "tk-framework-dependency",
            "type": "app_store"
        })
        # This is V1 of a framework that has no depdendencies.
        mock_store.add_framework("tk-framework-main", "v1.0.0")
        # This is V2 of a framework that now has a depdendency
        mock_store.add_framework("tk-framework-main", "v2.0.0").required_frameworks = [
            dependency.get_major_dependency_descriptor()
        ]

        # Makes sure we respect the interface of the TankAppStoreDescriptor

        desc = create_descriptor(
            None,
            Descriptor.FRAMEWORK,
            {"name": "tk-framework-main", "version": "v2.0.0", "type": "app_store"}
        )

        self.assertEqual(
            desc.required_frameworks,
            [{"type": "app_store", "name": "tk-framework-dependency", "version": "v1.x.x"}]
        )

        desc = create_descriptor(
            None,
            Descriptor.FRAMEWORK,
            {"name": "tk-framework-main", "version": "v1.0.0", "type": "app_store"}
        )

        self.assertEqual(desc.required_frameworks, [])
Beispiel #3
0
    def test_label_support(self, find_mock, find_one_mock):
        """
        Tests the label syntax and that it restricts versions correctly
        """
        def find_one_mock_impl(*args, **kwargs):
            """
            The app store implementation will call this once to resolve the main
            app as part of retrieving latest.
            Expected form:

            args: (
                'CustomNonProjectEntity13',
                [['sg_system_name', 'is', 'tk-framework-main']],
                ['id', 'sg_system_name', 'sg_status_list', 'sg_deprecation_message']
                )
            kwargs: {}
            """
            # ensure that input is what we expected
            self.assertEqual(kwargs, {})
            self.assertEqual(
                args,
                (
                    "CustomNonProjectEntity13",
                    [["sg_system_name", "is", "tk-framework-main"]],
                    [
                        "id",
                        "sg_system_name",
                        "sg_status_list",
                        "sg_deprecation_message",
                    ],
                ),
            )

            return {
                "type": "CustomNonProjectEntity13",
                "id": 1234,
                "sg_system_name": "tk-framework-main",
                "sg_status_list": "prod",
                "sg_deprecation_message": None,
            }

        def find_mock_impl(*args, **kwargs):
            """
            The find call to get app store versions will arrive here as a consequence
            of the find_latest_version call.
            Expected form:

            args: ('CustomNonProjectEntity09',)
            kwargs: {
                'fields': [
                    'id', 'code', 'sg_status_list', 'description', 'tags', 'sg_detailed_release_notes',
                    'sg_documentation', 'sg_payload'
                ],
                'limit': 1,
                'order': [{'direction': 'desc', 'field_name': 'created_at'}],
                'filters': [['sg_status_list', 'is_not', 'rev'], ['sg_status_list', 'is_not', 'bad'],
                            ['sg_tank_framework', 'is', {'sg_status_list': 'prod', 'type': 'CustomNonProjectEntity13', 'id': 1234,
               'sg_system_name': 'tk-framework-main',
               'sg_deprecation_message': None}]]
            }
            """
            self.assertEqual(args, ("CustomNonProjectEntity09", ))

            # app store is trying to be smart about bandwidth depending on queries, so limit may vary.
            kwargs["limit"] = None

            self.assertEqual(
                kwargs,
                {
                    "fields": [
                        "id",
                        "code",
                        "sg_status_list",
                        "description",
                        "tags",
                        "sg_detailed_release_notes",
                        "sg_documentation",
                        "sg_payload",
                    ],
                    "limit":
                    None,
                    "order": [{
                        "direction": "desc",
                        "field_name": "created_at"
                    }],
                    "filters": [
                        ["sg_status_list", "is_not", "rev"],
                        ["sg_status_list", "is_not", "bad"],
                        [
                            "sg_tank_framework",
                            "is",
                            {
                                "sg_status_list": "prod",
                                "type": "CustomNonProjectEntity13",
                                "id": 1234,
                                "sg_system_name": "tk-framework-main",
                                "sg_deprecation_message": None,
                            },
                        ],
                    ],
                },
            )

            return_data = []

            return_data.append({
                "type":
                "CustomNonProjectEntity09",
                "id":
                1,
                "code":
                "v1.0.1",
                "tags": [
                    {
                        "id": 1,
                        "name": "2017.*",
                        "type": "Tag"
                    },
                    {
                        "id": 2,
                        "name": "2016.*",
                        "type": "Tag"
                    },
                ],
                "sg_detailed_release_notes":
                "Test 1",
                "sg_status_list":
                "prod",
                "description":
                "dummy",
                "sg_detailed_release_notes":
                "dummy",
                "sg_documentation":
                "dummy",
                "sg_payload": {},
            })

            return_data.append({
                "type":
                "CustomNonProjectEntity09",
                "id":
                2,
                "code":
                "v2.0.1",
                "tags": [{
                    "id": 1,
                    "name": "2017.*",
                    "type": "Tag"
                }],
                "sg_detailed_release_notes":
                "Test 2",
                "sg_status_list":
                "prod",
                "description":
                "dummy",
                "sg_detailed_release_notes":
                "dummy",
                "sg_documentation":
                "dummy",
                "sg_payload": {},
            })

            return_data.append({
                "type":
                "CustomNonProjectEntity09",
                "id":
                3,
                "code":
                "v3.0.1",
                "tags": [{
                    "id": 3,
                    "name": "2018.*",
                    "type": "Tag"
                }],
                "sg_detailed_release_notes":
                "Test 3",
                "sg_status_list":
                "prod",
                "description":
                "dummy",
                "sg_detailed_release_notes":
                "dummy",
                "sg_documentation":
                "dummy",
                "sg_payload": {},
            })

            # return it in desc/reverse order, e.g. higher versions last, as requested by the API call
            return return_data[::-1]

        find_mock.side_effect = find_mock_impl
        find_one_mock.side_effect = find_one_mock_impl

        # no label
        desc = create_descriptor(
            None,
            Descriptor.FRAMEWORK,
            {
                "name": "tk-framework-main",
                "version": "v1.0.0",
                "type": "app_store"
            },
        )
        self.assertEqual(
            desc.get_uri(),
            "sgtk:descriptor:app_store?name=tk-framework-main&version=v1.0.0",
        )
        desc2 = desc.find_latest_version()
        self.assertEqual(
            desc2.get_uri(),
            "sgtk:descriptor:app_store?name=tk-framework-main&version=v3.0.1",
        )

        # i am version 2016.3.45 so i am only getting 1.0.1
        desc = create_descriptor(
            None,
            Descriptor.FRAMEWORK,
            {
                "name": "tk-framework-main",
                "version": "v1.0.0",
                "type": "app_store",
                "label": "2016.3.45",
            },
        )
        self.assertEqual(
            desc.get_uri(),
            "sgtk:descriptor:app_store?label=2016.3.45&name=tk-framework-main&version=v1.0.0",
        )
        desc2 = desc.find_latest_version()
        self.assertEqual(
            desc2.get_uri(),
            "sgtk:descriptor:app_store?label=2016.3.45&name=tk-framework-main&version=v1.0.1",
        )

        # i am version 2017.3.45 so i am getting 2.0.1
        desc = create_descriptor(
            None,
            Descriptor.FRAMEWORK,
            {
                "name": "tk-framework-main",
                "version": "v1.0.0",
                "type": "app_store",
                "label": "2017.3.45",
            },
        )
        self.assertEqual(
            desc.get_uri(),
            "sgtk:descriptor:app_store?label=2017.3.45&name=tk-framework-main&version=v1.0.0",
        )
        desc2 = desc.find_latest_version()
        self.assertEqual(
            desc2.get_uri(),
            "sgtk:descriptor:app_store?label=2017.3.45&name=tk-framework-main&version=v2.0.1",
        )

        # i am version 2018.3.45 so i am getting 3.0.1
        desc = create_descriptor(
            None,
            Descriptor.FRAMEWORK,
            {
                "name": "tk-framework-main",
                "version": "v1.0.0",
                "type": "app_store",
                "label": "2018.3.45",
            },
        )
        self.assertEqual(
            desc.get_uri(),
            "sgtk:descriptor:app_store?label=2018.3.45&name=tk-framework-main&version=v1.0.0",
        )
        desc2 = desc.find_latest_version()
        self.assertEqual(
            desc2.get_uri(),
            "sgtk:descriptor:app_store?label=2018.3.45&name=tk-framework-main&version=v3.0.1",
        )
def _build_bundle_cache(sg_connection, target_path, config_descriptor_uri):
    """
    Perform a build of the bundle cache.

    This will build the bundle cache for a given config descriptor.

    :param sg_connection: Shotgun connection
    :param target_path: Path to build
    :param config_descriptor_uri: Descriptor of the configuration to cache.
    """
    logger.info("The build will generated into '%s'" % target_path)

    bundle_cache_root = os.path.join(target_path,
                                     BUNDLE_CACHE_ROOT_FOLDER_NAME)

    # try to create target path
    logger.info("Creating bundle cache folder...")
    filesystem.ensure_folder_exists(bundle_cache_root)

    # Resolve the configuration
    cfg_descriptor = create_descriptor(
        sg_connection,
        Descriptor.CONFIG,
        config_descriptor_uri,
        # If the user hasn't specified the version to retrieve, resolve the latest from Shotgun.
        resolve_latest=is_descriptor_version_missing(config_descriptor_uri))

    logger.info("Resolved config %r" % cfg_descriptor)
    logger.info("Runtime config descriptor uri will be %s" %
                config_descriptor_uri)

    # cache config in bundle cache
    logger.info("Downloading and caching config...")

    cfg_descriptor.ensure_local()

    # copy the config payload across to the plugin bundle cache
    cfg_descriptor.clone_cache(bundle_cache_root)

    # cache all apps, engines and frameworks
    cache_apps(sg_connection, cfg_descriptor, bundle_cache_root)

    if cfg_descriptor.associated_core_descriptor:
        logger.info(
            "Config is specifying a custom core in config/core/core_api.yml.")
        logger.info("This will be used when the config is executing.")
        logger.info("Ensuring this core (%s) is cached..." %
                    cfg_descriptor.associated_core_descriptor)
        bootstrap_core_desc = create_descriptor(
            sg_connection,
            Descriptor.CORE,
            cfg_descriptor.associated_core_descriptor,
            bundle_cache_root_override=bundle_cache_root)
        # cache it
        bootstrap_core_desc.ensure_local()
        bootstrap_core_desc.clone_cache(bundle_cache_root)

    cleanup_bundle_cache(bundle_cache_root)

    logger.info("")
    logger.info("Build complete!")
    logger.info("")
    logger.info("- Your bundle cache is ready in '%s'" % target_path)
    logger.info(
        "- All dependencies have been baked out into the bundle_cache folder")
    logger.info("")
def _build_bundle_cache(sg_connection, target_path, config_descriptor_uri):
    """
    Perform a build of the bundle cache.

    This will build the bundle cache for a given config descriptor.

    :param sg_connection: Shotgun connection
    :param target_path: Path to build
    :param config_descriptor_uri: Descriptor of the configuration to cache.
    """
    logger.info("The build will generated into '%s'" % target_path)

    bundle_cache_root = os.path.join(target_path, BUNDLE_CACHE_ROOT_FOLDER_NAME)

    # try to create target path
    logger.info("Creating bundle cache folder...")
    filesystem.ensure_folder_exists(bundle_cache_root)

    # Resolve the configuration
    cfg_descriptor = create_descriptor(
        sg_connection,
        Descriptor.CONFIG,
        config_descriptor_uri,
        # If the user hasn't specified the version to retrieve, resolve the latest from Shotgun.
        resolve_latest=is_descriptor_version_missing(config_descriptor_uri)
    )

    logger.info("Resolved config %r" % cfg_descriptor)
    logger.info("Runtime config descriptor uri will be %s" % config_descriptor_uri)

    # cache config in bundle cache
    logger.info("Downloading and caching config...")

    cfg_descriptor.ensure_local()

    # copy the config payload across to the plugin bundle cache
    cfg_descriptor.clone_cache(bundle_cache_root)

    # cache all apps, engines and frameworks
    cache_apps(sg_connection, cfg_descriptor, bundle_cache_root)

    if cfg_descriptor.associated_core_descriptor:
        logger.info("Config is specifying a custom core in config/core/core_api.yml.")
        logger.info("This will be used when the config is executing.")
        logger.info("Ensuring this core (%s) is cached..." % cfg_descriptor.associated_core_descriptor)
        bootstrap_core_desc = create_descriptor(
            sg_connection,
            Descriptor.CORE,
            cfg_descriptor.associated_core_descriptor,
            bundle_cache_root_override=bundle_cache_root
        )
        # cache it
        bootstrap_core_desc.ensure_local()
        bootstrap_core_desc.clone_cache(bundle_cache_root)

    cleanup_bundle_cache(bundle_cache_root)

    logger.info("")
    logger.info("Build complete!")
    logger.info("")
    logger.info("- Your bundle cache is ready in '%s'" % target_path)
    logger.info("- All dependencies have been baked out into the bundle_cache folder")
    logger.info("")