# Copyright 2017 gRPC authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Defines languages, runtimes and releases for backward compatibility testing

from collections import OrderedDict


def get_github_repo(lang):
    return {
        "dart": "https://github.com/grpc/grpc-dart.git",
        "go": "https://github.com/grpc/grpc-go.git",
        "java": "https://github.com/grpc/grpc-java.git",
        "node": "https://github.com/grpc/grpc-node.git",
        # all other languages use the grpc.git repo.
    }.get(lang, "https://github.com/grpc/grpc.git")


def get_release_tags(lang):
    """Returns list of known releases for given language."""
    return list(LANG_RELEASE_MATRIX[lang].keys())


def get_runtimes_for_lang_release(lang, release):
    """Get list of valid runtimes for given release of lang."""
    runtimes = list(LANG_RUNTIME_MATRIX[lang])
    release_info = LANG_RELEASE_MATRIX[lang].get(release)
    if release_info and release_info.runtimes:
        runtimes = list(release_info.runtimes)
    return runtimes


def should_build_docker_interop_image_from_release_tag(lang):
    # All dockerfile definitions live in grpc/grpc repository.
    # For language that have a separate repo, we need to use
    # dockerfile definitions from head of grpc/grpc.
    if lang in ["go", "java", "node"]:
        return False
    return True


# Dictionary of default runtimes per language
LANG_RUNTIME_MATRIX = {
    "cxx": ["cxx"],  # This is actually debian8.
    "go": ["go1.8", "go1.11", "go1.16", "go1.19"],
    "java": ["java"],
    "python": ["python", "pythonasyncio"],
    "node": ["node"],
    "ruby": ["ruby"],
    "php": ["php7"],
    "csharp": ["csharp", "csharpcoreclr"],
}


class ReleaseInfo:
    """Info about a single release of a language"""

    def __init__(self, patch=[], runtimes=[], testcases_file=None):
        self.patch = patch
        self.runtimes = runtimes
        self.testcases_file = testcases_file


# Dictionary of known releases for given language.
LANG_RELEASE_MATRIX = {
    "cxx": OrderedDict(
        [
            ("v1.0.1", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.1.4", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.2.5", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.3.9", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.4.2", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.6.6", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.7.2", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.8.0", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.9.1", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.10.1", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.11.1", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.12.0", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.13.0", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.14.1", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.15.0", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.16.0", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.17.1", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.18.0", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.19.0", ReleaseInfo(testcases_file="cxx__v1.0.1")),
            ("v1.20.0", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.21.4", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.22.0", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.22.1", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.23.0", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.24.0", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.25.0", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.26.0", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.27.3", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.30.0", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.31.1", ReleaseInfo(testcases_file="cxx__v1.31.1")),
            ("v1.32.0", ReleaseInfo()),
            ("v1.33.2", ReleaseInfo()),
            ("v1.34.0", ReleaseInfo()),
            ("v1.35.0", ReleaseInfo()),
            ("v1.36.3", ReleaseInfo()),
            ("v1.37.0", ReleaseInfo()),
            ("v1.38.0", ReleaseInfo()),
            ("v1.39.0", ReleaseInfo()),
            ("v1.41.1", ReleaseInfo()),
            ("v1.42.0", ReleaseInfo()),
            ("v1.43.0", ReleaseInfo()),
            ("v1.44.0", ReleaseInfo()),
            ("v1.46.2", ReleaseInfo()),
            ("v1.47.1", ReleaseInfo()),
            ("v1.48.3", ReleaseInfo()),
            ("v1.49.1", ReleaseInfo()),
            ("v1.52.0", ReleaseInfo()),
            ("v1.53.0", ReleaseInfo()),
            ("v1.54.0", ReleaseInfo()),
            ("v1.55.0", ReleaseInfo()),
            ("v1.56.0", ReleaseInfo()),
            ("v1.57.0", ReleaseInfo()),
            ("v1.58.0", ReleaseInfo()),
            ("v1.60.0", ReleaseInfo()),
            ("v1.61.0", ReleaseInfo()),
            ("v1.62.0", ReleaseInfo()),
            ("v1.63.0", ReleaseInfo()),
        ]
    ),
    "go": OrderedDict(
        [
            (
                "v1.0.5",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.2.1",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.3.0",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.4.2",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.5.2",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.6.0",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.7.4",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.8.2",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.9.2",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.10.1",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.11.3",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.12.2",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.13.0",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.14.0",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.15.0",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.16.0",
                ReleaseInfo(runtimes=["go1.8"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.17.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.18.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.19.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.0.5"),
            ),
            (
                "v1.20.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.21.3",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.22.3",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.23.1",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.24.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.25.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.26.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.27.1",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.28.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.29.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.30.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.31.1",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.32.0",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            (
                "v1.33.1",
                ReleaseInfo(runtimes=["go1.11"], testcases_file="go__v1.20.0"),
            ),
            ("v1.34.0", ReleaseInfo(runtimes=["go1.11"])),
            ("v1.35.0", ReleaseInfo(runtimes=["go1.11"])),
            ("v1.36.0", ReleaseInfo(runtimes=["go1.11"])),
            ("v1.37.0", ReleaseInfo(runtimes=["go1.11"])),
            # NOTE: starting from release v1.38.0, use runtimes=['go1.16']
            ("v1.38.1", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.39.1", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.40.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.41.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.42.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.43.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.44.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.45.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.46.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.47.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.48.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.49.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.50.1", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.51.0", ReleaseInfo(runtimes=["go1.16"])),
            ("v1.52.3", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.53.0", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.54.1", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.55.0", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.56.3", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.57.2", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.58.3", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.59.0", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.60.1", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.61.2", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.62.2", ReleaseInfo(runtimes=["go1.19"])),
            ("v1.63.2", ReleaseInfo(runtimes=["go1.19"])),
        ]
    ),
    "java": OrderedDict(
        [
            (
                "v1.0.3",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            (
                "v1.1.2",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            (
                "v1.2.0",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            (
                "v1.3.1",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            (
                "v1.4.0",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            (
                "v1.5.0",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            (
                "v1.6.1",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            ("v1.7.1", ReleaseInfo(testcases_file="java__v1.0.3")),
            (
                "v1.8.0",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            (
                "v1.9.1",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            (
                "v1.10.1",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            (
                "v1.11.0",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            ("v1.12.1", ReleaseInfo(testcases_file="java__v1.0.3")),
            ("v1.13.2", ReleaseInfo(testcases_file="java__v1.0.3")),
            (
                "v1.14.0",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            ("v1.15.1", ReleaseInfo(testcases_file="java__v1.0.3")),
            (
                "v1.16.1",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            ("v1.17.2", ReleaseInfo(testcases_file="java__v1.0.3")),
            (
                "v1.18.0",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            (
                "v1.19.0",
                ReleaseInfo(
                    runtimes=["java_oracle8"], testcases_file="java__v1.0.3"
                ),
            ),
            ("v1.20.0", ReleaseInfo(runtimes=["java_oracle8"])),
            ("v1.21.1", ReleaseInfo()),
            ("v1.22.2", ReleaseInfo()),
            ("v1.23.0", ReleaseInfo()),
            ("v1.24.0", ReleaseInfo()),
            ("v1.25.0", ReleaseInfo()),
            ("v1.26.1", ReleaseInfo()),
            ("v1.27.2", ReleaseInfo()),
            ("v1.28.1", ReleaseInfo()),
            ("v1.29.0", ReleaseInfo()),
            ("v1.30.2", ReleaseInfo()),
            ("v1.31.2", ReleaseInfo()),
            ("v1.32.3", ReleaseInfo()),
            ("v1.33.1", ReleaseInfo()),
            ("v1.34.1", ReleaseInfo()),
            ("v1.35.1", ReleaseInfo()),
            ("v1.36.3", ReleaseInfo()),
            ("v1.37.1", ReleaseInfo()),
            ("v1.38.1", ReleaseInfo()),
            ("v1.39.0", ReleaseInfo()),
            ("v1.40.2", ReleaseInfo()),
            ("v1.41.3", ReleaseInfo()),
            ("v1.42.3", ReleaseInfo()),
            ("v1.43.3", ReleaseInfo()),
            ("v1.44.2", ReleaseInfo()),
            ("v1.45.4", ReleaseInfo()),
            ("v1.46.1", ReleaseInfo()),
            ("v1.47.1", ReleaseInfo()),
            ("v1.48.2", ReleaseInfo()),
            ("v1.49.2", ReleaseInfo()),
            ("v1.50.3", ReleaseInfo()),
            ("v1.51.3", ReleaseInfo()),
            ("v1.52.1", ReleaseInfo()),
            ("v1.53.0", ReleaseInfo()),
            ("v1.54.0", ReleaseInfo()),
            ("v1.55.1", ReleaseInfo()),
            ("v1.56.0", ReleaseInfo()),
            ("v1.57.2", ReleaseInfo()),
            ("v1.58.0", ReleaseInfo()),
            ("v1.59.1", ReleaseInfo()),
            ("v1.60.1", ReleaseInfo()),
            ("v1.61.0", ReleaseInfo()),
            ("v1.63.0", ReleaseInfo()),
        ]
    ),
    "python": OrderedDict(
        [
            (
                "v1.0.x",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.0.x"
                ),
            ),
            (
                "v1.1.4",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.0.x"
                ),
            ),
            (
                "v1.2.5",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.0.x"
                ),
            ),
            (
                "v1.3.9",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.0.x"
                ),
            ),
            (
                "v1.4.2",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.0.x"
                ),
            ),
            (
                "v1.6.6",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.0.x"
                ),
            ),
            (
                "v1.7.2",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.0.x"
                ),
            ),
            (
                "v1.8.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.0.x"
                ),
            ),
            (
                "v1.9.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.0.x"
                ),
            ),
            (
                "v1.10.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.0.x"
                ),
            ),
            (
                "v1.11.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.11.1"
                ),
            ),
            (
                "v1.12.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.11.1"
                ),
            ),
            (
                "v1.13.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.11.1"
                ),
            ),
            (
                "v1.14.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.11.1"
                ),
            ),
            (
                "v1.15.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.11.1"
                ),
            ),
            (
                "v1.16.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.11.1"
                ),
            ),
            (
                "v1.17.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.11.1"
                ),
            ),
            (
                "v1.18.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.19.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.20.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.21.4",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.22.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.22.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.23.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.24.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.25.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.26.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.27.3",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.30.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.31.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.32.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.33.2",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.34.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.35.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.36.3",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.37.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.38.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.39.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.18.0"
                ),
            ),
            (
                "v1.41.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.41.1"
                ),
            ),
            (
                "v1.42.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.41.1"
                ),
            ),
            (
                "v1.43.2",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__v1.41.1"
                ),
            ),
            (
                "v1.44.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.46.2",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.47.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.48.3",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.49.1",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.52.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.53.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.54.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.55.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.56.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.57.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.58.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.60.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.61.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.62.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
            (
                "v1.63.0",
                ReleaseInfo(
                    runtimes=["python"], testcases_file="python__master"
                ),
            ),
        ]
    ),
    "node": OrderedDict(
        [
            ("v1.0.1", ReleaseInfo(testcases_file="node__v1.0.1")),
            ("v1.1.4", ReleaseInfo(testcases_file="node__v1.1.4")),
            ("v1.2.5", ReleaseInfo(testcases_file="node__v1.1.4")),
            ("v1.3.9", ReleaseInfo(testcases_file="node__v1.1.4")),
            ("v1.4.2", ReleaseInfo(testcases_file="node__v1.1.4")),
            ("v1.6.6", ReleaseInfo(testcases_file="node__v1.1.4")),
            # TODO: https://github.com/grpc/grpc-node/issues/235.
            # ('v1.7.2', ReleaseInfo()),
            ("v1.8.4", ReleaseInfo()),
            ("v1.9.1", ReleaseInfo()),
            ("v1.10.0", ReleaseInfo()),
            ("v1.11.3", ReleaseInfo()),
            ("v1.12.4", ReleaseInfo()),
        ]
    ),
    "ruby": OrderedDict(
        [
            (
                "v1.0.1",
                ReleaseInfo(
                    patch=[
                        "tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile",
                        "tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh",
                    ],
                    testcases_file="ruby__v1.0.1",
                ),
            ),
            ("v1.1.4", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.2.5", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.3.9", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.4.2", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.6.6", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.7.2", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.8.0", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.9.1", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.10.1", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.11.1", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.12.0", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.13.0", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.14.1", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.15.0", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.16.0", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            ("v1.17.1", ReleaseInfo(testcases_file="ruby__v1.1.4")),
            (
                "v1.18.0",
                ReleaseInfo(
                    patch=[
                        "tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh",
                    ]
                ),
            ),
            ("v1.19.0", ReleaseInfo()),
            ("v1.20.0", ReleaseInfo()),
            ("v1.21.4", ReleaseInfo()),
            ("v1.22.0", ReleaseInfo()),
            ("v1.22.1", ReleaseInfo()),
            ("v1.23.0", ReleaseInfo()),
            ("v1.24.0", ReleaseInfo()),
            ("v1.25.0", ReleaseInfo()),
            # TODO: https://github.com/grpc/grpc/issues/18262.
            # If you are not encountering the error in above issue
            # go ahead and upload the docker image for new releases.
            ("v1.26.0", ReleaseInfo()),
            ("v1.27.3", ReleaseInfo()),
            ("v1.30.0", ReleaseInfo()),
            ("v1.31.1", ReleaseInfo()),
            ("v1.32.0", ReleaseInfo()),
            ("v1.33.2", ReleaseInfo()),
            ("v1.34.0", ReleaseInfo()),
            ("v1.35.0", ReleaseInfo()),
            ("v1.36.3", ReleaseInfo()),
            ("v1.37.0", ReleaseInfo()),
            ("v1.38.0", ReleaseInfo()),
            ("v1.39.0", ReleaseInfo()),
            ("v1.41.1", ReleaseInfo()),
            ("v1.42.0", ReleaseInfo()),
            ("v1.43.0", ReleaseInfo()),
            ("v1.44.0", ReleaseInfo()),
            ("v1.46.2", ReleaseInfo()),
            ("v1.47.1", ReleaseInfo()),
            ("v1.48.3", ReleaseInfo()),
            ("v1.49.1", ReleaseInfo()),
            ("v1.52.0", ReleaseInfo()),
            ("v1.53.0", ReleaseInfo()),
            ("v1.54.0", ReleaseInfo()),
            ("v1.55.0", ReleaseInfo()),
            ("v1.56.0", ReleaseInfo()),
            ("v1.57.0", ReleaseInfo()),
            ("v1.58.0", ReleaseInfo()),
            ("v1.60.0", ReleaseInfo()),
            ("v1.61.0", ReleaseInfo()),
            ("v1.62.0", ReleaseInfo()),
            ("v1.63.0", ReleaseInfo()),
        ]
    ),
    "php": OrderedDict(
        [
            ("v1.0.1", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.1.4", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.2.5", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.3.9", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.4.2", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.6.6", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.7.2", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.8.0", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.9.1", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.10.1", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.11.1", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.12.0", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.13.0", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.14.1", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.15.0", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.16.0", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.17.1", ReleaseInfo(testcases_file="php__v1.0.1")),
            ("v1.18.0", ReleaseInfo()),
            # v1.19 and v1.20 were deliberately omitted here because of an issue.
            # See https://github.com/grpc/grpc/issues/18264
            ("v1.21.4", ReleaseInfo()),
            ("v1.22.0", ReleaseInfo()),
            ("v1.22.1", ReleaseInfo()),
            ("v1.23.0", ReleaseInfo()),
            ("v1.24.0", ReleaseInfo()),
            ("v1.25.0", ReleaseInfo()),
            ("v1.26.0", ReleaseInfo()),
            ("v1.27.3", ReleaseInfo()),
            ("v1.30.0", ReleaseInfo()),
            ("v1.31.1", ReleaseInfo()),
            ("v1.32.0", ReleaseInfo()),
            ("v1.33.2", ReleaseInfo()),
            ("v1.34.0", ReleaseInfo()),
            ("v1.35.0", ReleaseInfo()),
            ("v1.36.3", ReleaseInfo()),
            ("v1.37.0", ReleaseInfo()),
            ("v1.38.0", ReleaseInfo()),
            ("v1.39.0", ReleaseInfo()),
            ("v1.41.1", ReleaseInfo()),
            ("v1.42.0", ReleaseInfo()),
            ("v1.43.0", ReleaseInfo()),
            ("v1.44.0", ReleaseInfo()),
            ("v1.46.2", ReleaseInfo()),
            ("v1.47.1", ReleaseInfo()),
            ("v1.48.3", ReleaseInfo()),
            ("v1.49.1", ReleaseInfo()),
            ("v1.52.0", ReleaseInfo()),
            ("v1.53.0", ReleaseInfo()),
            ("v1.54.0", ReleaseInfo()),
            ("v1.55.0", ReleaseInfo()),
            ("v1.56.0", ReleaseInfo()),
            ("v1.57.0", ReleaseInfo()),
            ("v1.58.0", ReleaseInfo()),
            ("v1.60.0", ReleaseInfo()),
            ("v1.61.0", ReleaseInfo()),
            ("v1.62.0", ReleaseInfo()),
            ("v1.63.0", ReleaseInfo()),
        ]
    ),
    "csharp": OrderedDict(
        [
            (
                "v1.0.1",
                ReleaseInfo(
                    patch=[
                        "tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile",
                        "tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile",
                    ],
                    testcases_file="csharp__v1.1.4",
                ),
            ),
            ("v1.1.4", ReleaseInfo(testcases_file="csharp__v1.1.4")),
            ("v1.2.5", ReleaseInfo(testcases_file="csharp__v1.1.4")),
            ("v1.3.9", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.4.2", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.6.6", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.7.2", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.8.0", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.9.1", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.10.1", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.11.1", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.12.0", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.13.0", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.14.1", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.15.0", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.16.0", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.17.1", ReleaseInfo(testcases_file="csharp__v1.3.9")),
            ("v1.18.0", ReleaseInfo(testcases_file="csharp__v1.18.0")),
            ("v1.19.0", ReleaseInfo(testcases_file="csharp__v1.18.0")),
            ("v1.20.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.20.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.21.4", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.22.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.22.1", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.23.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.24.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.25.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.26.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.27.3", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.30.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.31.1", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.32.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.33.2", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.34.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.35.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.36.3", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.37.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.38.1", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.39.1", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.41.1", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.42.0", ReleaseInfo(testcases_file="csharp__v1.20.0")),
            ("v1.43.0", ReleaseInfo()),
            ("v1.44.0", ReleaseInfo()),
            ("v1.46.2", ReleaseInfo()),
        ]
    ),
}