package(default_visibility = ["//visibility:public"])

load(
    "//build:platforms.bzl",
    "CLIENT_PLATFORMS",
    "NODE_PLATFORMS",
    "SERVER_PLATFORMS",
    "TEST_PLATFORMS",
    "for_platforms",
    "go_platform_constraint",
)
load("@io_k8s_repo_infra//defs:build.bzl", "release_filegroup")
load("@io_k8s_repo_infra//defs:pkg.bzl", "pkg_tar")
load("//staging:repos_generated.bzl", "staging_repos")

# Bazel doesn't make the output filename
# (such as kubernetes-server-{OS}-{ARCH}.tar.gz) configurable, so we instead
# create rules for all platforms and tag them manual.
# We then select the correct set of platform-specific tarballs in this filegroup
# using a select() statement.
# Thus the release-tars target always selects the correct set of tarballs
# for the configured platform being built.
release_filegroup(
    name = "release-tars",
    conditioned_srcs = for_platforms(
        for_all = [
            ":kubernetes.tar.gz",
            ":kubernetes-src.tar.gz",
        ],
        for_client = [":kubernetes-client-{OS}-{ARCH}.tar.gz"],
        for_node = [":kubernetes-node-{OS}-{ARCH}.tar.gz"],
        for_server = [
            ":kubernetes-server-{OS}-{ARCH}.tar.gz",
            ":kubernetes-manifests.tar.gz",
        ],
        for_test = [
            ":kubernetes-test-portable.tar.gz",
            ":kubernetes-test-{OS}-{ARCH}.tar.gz",
        ],
    ),
)

filegroup(
    name = "package-srcs",
    srcs = glob(["**"]),
    tags = ["automanaged"],
    visibility = ["//visibility:private"],
)

filegroup(
    name = "all-srcs",
    srcs = [":package-srcs"],
    tags = ["automanaged"],
)

pkg_tar(
    name = "kubernetes-src",
    srcs = ["//:all-srcs"],
    extension = "tar.gz",
    package_dir = "kubernetes",
    strip_prefix = "//",
    symlinks = {
        "kubernetes/vendor/%s" % repo: "../../staging/src/%s" % repo
        for repo in staging_repos
    },
    tags = [
        "manual",
        "no-cache",
    ],
)

# Included in node and server tarballs.
pkg_tar(
    name = "license-artifacts",
    srcs = [
        ":kubernetes-src.tar.gz",  # we want the tar file itself
    ],
    mode = "0755",
    tags = [
        "manual",
        "no-cache",
    ],
    visibility = ["//visibility:private"],
    deps = [
        "//:LICENSES",  # we want to expand this
    ],
)

pkg_tar(
    name = "_client-bin",
    srcs = ["//build:client-targets"],
    mode = "0755",
    package_dir = "client/bin",
    tags = [
        "manual",
        "no-cache",
    ],
    visibility = ["//visibility:private"],
)

[[pkg_tar(
    name = "kubernetes-client-%s-%s" % (os, arch),
    extension = "tar.gz",
    package_dir = "kubernetes",
    tags = [
        "manual",
        "no-cache",
    ],
    deps = select({go_platform_constraint(os, arch): [":_client-bin"]}),
) for arch in archs] for os, archs in CLIENT_PLATFORMS.items()]

pkg_tar(
    name = "_node-bin",
    srcs = [
        "//build:client-targets",
        "//build:node-targets",
    ],
    mode = "0755",
    package_dir = "node/bin",
    tags = [
        "manual",
        "no-cache",
    ],
    visibility = ["//visibility:private"],
)

[[pkg_tar(
    name = "kubernetes-node-%s-%s" % (os, arch),
    srcs = [],
    extension = "tar.gz",
    mode = "0644",
    package_dir = "kubernetes",
    tags = [
        "manual",
        "no-cache",
    ],
    deps = select({go_platform_constraint(os, arch): [":_node-bin"]}) + [
        ":license-artifacts",
    ],
) for arch in archs] for os, archs in NODE_PLATFORMS.items()]

pkg_tar(
    name = "_server-bin",
    srcs = [
        "//build:client-targets",
        "//build:docker-artifacts",
        "//build:node-targets",
        "//build:server-targets",
    ],
    mode = "0755",
    package_dir = "server/bin",
    tags = [
        "manual",
        "no-cache",
    ],
    visibility = ["//visibility:private"],
)

genrule(
    name = "dummy",
    outs = [".dummy"],
    cmd = "touch $@",
    visibility = ["//visibility:private"],
)

# Some of the startup scripts fail if there isn't an addons/ directory in the server tarball.
pkg_tar(
    name = "_server-addons",
    srcs = [
        ":.dummy",
    ],
    package_dir = "addons",
    tags = [
        "manual",
        "no-cache",
    ],
    visibility = ["//visibility:private"],
)

[[pkg_tar(
    name = "kubernetes-server-%s-%s" % (os, arch),
    srcs = [],
    extension = "tar.gz",
    mode = "0644",
    package_dir = "kubernetes",
    tags = [
        "manual",
        "no-cache",
    ],
    deps = select({
        go_platform_constraint(os, arch): [
            ":_server-addons",
            ":_server-bin",
        ],
    }) + [
        ":license-artifacts",
    ],
) for arch in archs] for os, archs in SERVER_PLATFORMS.items()]

pkg_tar(
    name = "kubernetes-test-portable",
    srcs = ["//build:test-portable-targets"],
    extension = "tar.gz",
    package_dir = "kubernetes",
    strip_prefix = "//",
    tags = ["no-cache"],
)

pkg_tar(
    name = "_test-bin",
    srcs = ["//build:test-targets"],
    mode = "0755",
    package_dir = "test/bin",
    tags = [
        "manual",
        "no-cache",
    ],
    visibility = ["//visibility:private"],
)

[[pkg_tar(
    name = "kubernetes-test-%s-%s" % (os, arch),
    extension = "tar.gz",
    package_dir = "kubernetes",
    strip_prefix = "//",
    tags = [
        "manual",
        "no-cache",
    ],
    deps = select({go_platform_constraint(os, arch): [":_test-bin"]}),
) for arch in archs] for os, archs in TEST_PLATFORMS.items()]

pkg_tar(
    name = "_full_server",
    srcs = [
        ":kubernetes-manifests.tar.gz",
    ],
    package_dir = "server",
    tags = [
        "manual",
        "no-cache",
    ],
    visibility = ["//visibility:private"],
)

pkg_tar(
    name = "kubernetes",
    srcs = [
        "//:README.md",
        "//:version",
        "//cluster:all-srcs",
        "//docs:all-srcs",
        "//hack/lib:all-srcs",
    ],
    extension = "tar.gz",
    package_dir = "kubernetes",
    strip_prefix = "//",
    symlinks = {
        "kubernetes/cluster/gce/cos/": "gci",
        "kubernetes/cluster/gce/custom/": "gci",
        "kubernetes/cluster/gce/ubuntu/": "gci",
    },
    tags = ["no-cache"],
    deps = [
        ":_full_server",
        ":license-artifacts",
    ],
)

pkg_tar(
    name = "kubernetes-manifests",
    extension = "tar.gz",
    tags = ["no-cache"],
    deps = [
        "//cluster:manifests",
    ],
)
