{ "kind": "Pod", "apiVersion": "v1", "metadata": { "name": "downloads-7644b6f88d-gdpqq", "generateName": "downloads-7644b6f88d-", "namespace": "openshift-console", "uid": "c8f2bf7c-697e-48d8-aec0-2132c45277ec", "resourceVersion": "151566490", "generation": 1, "creationTimestamp": "2026-03-01T11:10:22Z", "labels": { "app": "console", "component": "downloads", "pod-template-hash": "7644b6f88d" }, "annotations": { "k8s.ovn.org/pod-networks": "{\"default\":{\"ip_addresses\":[\"10.128.0.173/23\"],\"mac_address\":\"0a:58:0a:80:00:ad\",\"gateway_ips\":[\"10.128.0.1\"],\"routes\":[{\"dest\":\"10.128.0.0/14\",\"nextHop\":\"10.128.0.1\"},{\"dest\":\"172.30.0.0/16\",\"nextHop\":\"10.128.0.1\"},{\"dest\":\"169.254.0.5/32\",\"nextHop\":\"10.128.0.1\"},{\"dest\":\"100.64.0.0/16\",\"nextHop\":\"10.128.0.1\"}],\"ip_address\":\"10.128.0.173/23\",\"gateway_ip\":\"10.128.0.1\",\"role\":\"primary\"}}", "k8s.v1.cni.cncf.io/network-status": "[{\n \"name\": \"ovn-kubernetes\",\n \"interface\": \"eth0\",\n \"ips\": [\n \"10.128.0.173\"\n ],\n \"mac\": \"0a:58:0a:80:00:ad\",\n \"default\": true,\n \"dns\": {}\n}]", "openshift.io/required-scc": "restricted-v2", "openshift.io/scc": "restricted-v2", "seccomp.security.alpha.kubernetes.io/pod": "runtime/default", "security.openshift.io/validated-scc-subject-type": "user" }, "ownerReferences": [ { "apiVersion": "apps/v1", "kind": "ReplicaSet", "name": "downloads-7644b6f88d", "uid": "fd70f3f5-f59e-417c-88c3-b58193901b98", "controller": true, "blockOwnerDeletion": true } ], "managedFields": [ { "manager": "kube-controller-manager", "operation": "Update", "apiVersion": "v1", "time": "2026-03-01T11:10:22Z", "fieldsType": "FieldsV1", "fieldsV1": { "f:metadata": { "f:annotations": { ".": {}, "f:openshift.io/required-scc": {}, "f:target.workload.openshift.io/management": {} }, "f:generateName": {}, "f:labels": { ".": {}, "f:app": {}, "f:component": {}, "f:pod-template-hash": {} }, "f:ownerReferences": { ".": {}, "k:{\"uid\":\"fd70f3f5-f59e-417c-88c3-b58193901b98\"}": {} } }, "f:spec": { "f:affinity": {}, "f:containers": { "k:{\"name\":\"download-server\"}": { ".": {}, "f:args": {}, "f:command": {}, "f:image": {}, "f:imagePullPolicy": {}, "f:livenessProbe": { ".": {}, "f:failureThreshold": {}, "f:httpGet": { ".": {}, "f:path": {}, "f:port": {}, "f:scheme": {} }, "f:periodSeconds": {}, "f:successThreshold": {}, "f:timeoutSeconds": {} }, "f:name": {}, "f:ports": { ".": {}, "k:{\"containerPort\":8080,\"protocol\":\"TCP\"}": { ".": {}, "f:containerPort": {}, "f:name": {}, "f:protocol": {} } }, "f:readinessProbe": { ".": {}, "f:failureThreshold": {}, "f:httpGet": { ".": {}, "f:path": {}, "f:port": {}, "f:scheme": {} }, "f:periodSeconds": {}, "f:successThreshold": {}, "f:timeoutSeconds": {} }, "f:resources": { ".": {}, "f:requests": { ".": {}, "f:cpu": {}, "f:memory": {} } }, "f:securityContext": { ".": {}, "f:allowPrivilegeEscalation": {}, "f:capabilities": { ".": {}, "f:drop": {} }, "f:readOnlyRootFilesystem": {} }, "f:terminationMessagePath": {}, "f:terminationMessagePolicy": {} } }, "f:dnsPolicy": {}, "f:enableServiceLinks": {}, "f:nodeSelector": {}, "f:priorityClassName": {}, "f:restartPolicy": {}, "f:schedulerName": {}, "f:securityContext": { ".": {}, "f:runAsNonRoot": {}, "f:seccompProfile": { ".": {}, "f:type": {} } }, "f:terminationGracePeriodSeconds": {}, "f:tolerations": {} } } }, { "manager": "master-0", "operation": "Update", "apiVersion": "v1", "time": "2026-03-01T11:10:22Z", "fieldsType": "FieldsV1", "fieldsV1": { "f:metadata": { "f:annotations": { "f:k8s.ovn.org/pod-networks": {} } } }, "subresource": "status" }, { "manager": "multus-daemon", "operation": "Update", "apiVersion": "v1", "time": "2026-03-01T11:52:03Z", "fieldsType": "FieldsV1", "fieldsV1": { "f:metadata": { "f:annotations": { "f:k8s.v1.cni.cncf.io/network-status": {} } } }, "subresource": "status" }, { "manager": "kubelet", "operation": "Update", "apiVersion": "v1", "time": "2026-03-01T11:53:08Z", "fieldsType": "FieldsV1", "fieldsV1": { "f:status": { "f:conditions": { "k:{\"type\":\"ContainersReady\"}": { ".": {}, "f:lastProbeTime": {}, "f:lastTransitionTime": {}, "f:status": {}, "f:type": {} }, "k:{\"type\":\"Initialized\"}": { ".": {}, "f:lastProbeTime": {}, "f:lastTransitionTime": {}, "f:status": {}, "f:type": {} }, "k:{\"type\":\"PodReadyToStartContainers\"}": { ".": {}, "f:lastProbeTime": {}, "f:lastTransitionTime": {}, "f:status": {}, "f:type": {} }, "k:{\"type\":\"Ready\"}": { ".": {}, "f:lastProbeTime": {}, "f:lastTransitionTime": {}, "f:status": {}, "f:type": {} } }, "f:containerStatuses": {}, "f:hostIP": {}, "f:hostIPs": {}, "f:phase": {}, "f:podIP": {}, "f:podIPs": { ".": {}, "k:{\"ip\":\"10.128.0.173\"}": { ".": {}, "f:ip": {} } }, "f:startTime": {} } }, "subresource": "status" } ] }, "spec": { "volumes": [ { "name": "kube-api-access-qj2gh", "projected": { "sources": [ { "serviceAccountToken": { "expirationSeconds": 3607, "path": "token" } }, { "configMap": { "name": "kube-root-ca.crt", "items": [ { "key": "ca.crt", "path": "ca.crt" } ] } }, { "downwardAPI": { "items": [ { "path": "namespace", "fieldRef": { "apiVersion": "v1", "fieldPath": "metadata.namespace" } } ] } }, { "configMap": { "name": "openshift-service-ca.crt", "items": [ { "key": "service-ca.crt", "path": "service-ca.crt" } ] } } ], "defaultMode": 420 } } ], "containers": [ { "name": "download-server", "image": "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:7aca367821614925d35e1b466169afbd7812a3cbceac19dbd8be18aef943a272", "command": [ "/bin/sh" ], "args": [ "-c", "cat \u003c\u003cEOF \u003e/tmp/serve.py\nimport errno, http.server, os, re, signal, socket, sys, tarfile, tempfile, threading, time, zipfile\n\ndef shutdown_handler(signum, frame):\n print(\"Received signal {}, shutting down...\".format(signum), flush=True)\n os._exit(0)\nsignal.signal(signal.SIGTERM, shutdown_handler)\n\ndef write_index(path, message):\n with open(path, 'wb') as f:\n f.write('\\n'.join([\n '\u003c!doctype html\u003e',\n '\u003chtml lang=\"en\"\u003e',\n '\u003chead\u003e',\n ' \u003cmeta charset=\"utf-8\"\u003e',\n '\u003c/head\u003e',\n '\u003cbody\u003e',\n ' {}'.format(message),\n '\u003c/body\u003e',\n '\u003c/html\u003e',\n '',\n ]).encode('utf-8'))\n\n# Launch multiple listeners as threads\nclass Thread(threading.Thread):\n def __init__(self, i, socket):\n threading.Thread.__init__(self)\n self.i = i\n self.socket = socket\n self.daemon = True\n self.start()\n\n def run(self):\n server = http.server.SimpleHTTPRequestHandler\n server.server_version = \"OpenShift Downloads Server\"\n server.sys_version = \"\"\n httpd = http.server.HTTPServer(addr, server, False)\n\n # Prevent the HTTP server from re-binding every handler.\n # https://stackoverflow.com/questions/46210672/\n httpd.socket = self.socket\n httpd.server_bind = self.server_close = lambda self: None\n\n httpd.serve_forever()\n\nprint('Starting downloads server...', flush=True)\ntemp_dir = tempfile.mkdtemp()\nprint('Serving from: {}'.format(temp_dir), flush=True)\nos.chdir(temp_dir)\n\nprint('Creating arch directories...', flush=True)\nfor arch in ['amd64', 'arm64', 'ppc64le', 's390x']:\n os.mkdir(arch)\n\ncontent = ['\u003ca href=\"oc-license\"\u003elicense\u003c/a\u003e']\nprint('Creating license symlink...', flush=True)\nos.symlink('/usr/share/openshift/LICENSE', 'oc-license')\n\n# Function to create archives in background\ndef create_archives_async(arch, operating_system, path, basename, archive_path_root):\n try:\n print(' [Background] Creating archives for {} {}...'.format(arch, operating_system), flush=True)\n \n print(' [Background] Creating tar archive...', flush=True)\n with tarfile.open('{}.tar'.format(archive_path_root), 'w') as tar:\n tar.add(path, basename)\n \n print(' [Background] Creating zip archive...', flush=True)\n with zipfile.ZipFile('{}.zip'.format(archive_path_root), 'w') as zip:\n zip.write(path, basename)\n \n print(' [Background] Done with archives for {} {}'.format(arch, operating_system), flush=True)\n except Exception as e:\n print(' [Background] ERROR creating archives for {} {}: {}'.format(arch, operating_system, str(e)), flush=True)\n\nprint('Creating oc binary symlinks (archives will be created asynchronously)...', flush=True)\narchive_threads = []\n\nfor arch, operating_system, path in [\n ('amd64', 'linux', '/usr/share/openshift/linux_amd64/oc'),\n ('amd64', 'mac', '/usr/share/openshift/mac/oc'),\n ('amd64', 'windows', '/usr/share/openshift/windows/oc.exe'),\n ('arm64', 'linux', '/usr/share/openshift/linux_arm64/oc'),\n ('arm64', 'mac', '/usr/share/openshift/mac_arm64/oc'),\n ('ppc64le', 'linux', '/usr/share/openshift/linux_ppc64le/oc'),\n ('s390x', 'linux', '/usr/share/openshift/linux_s390x/oc'),\n ]:\n try:\n print(' Processing {} {} ({})...'.format(arch, operating_system, path), flush=True)\n \n # Check if source file exists\n if not os.path.exists(path):\n print(' WARNING: {} does not exist, skipping'.format(path), flush=True)\n continue\n \n file_size = os.path.getsize(path)\n print(' Source file size: {} MB'.format(file_size // (1024*1024)), flush=True)\n \n basename = os.path.basename(path)\n target_path = os.path.join(arch, operating_system, basename)\n \n print(' Creating directory...', flush=True)\n os.mkdir(os.path.join(arch, operating_system))\n \n print(' Creating symlink...', flush=True)\n os.symlink(path, target_path)\n \n base_root, _ = os.path.splitext(basename)\n archive_path_root = os.path.join(arch, operating_system, base_root)\n \n # Start background thread to create archives\n archive_thread = threading.Thread(\n target=create_archives_async,\n args=(arch, operating_system, path, basename, archive_path_root),\n daemon=True\n )\n archive_thread.start()\n archive_threads.append(archive_thread)\n \n content.append(\n '\u003ca href=\"{0}\"\u003eoc ({1} {2})\u003c/a\u003e (\u003ca href=\"{3}.tar\"\u003etar\u003c/a\u003e \u003ca href=\"{3}.zip\"\u003ezip\u003c/a\u003e)'.format(\n target_path, arch, operating_system, archive_path_root\n )\n )\n print(' Done with {} {} (archives creating in background)'.format(arch, operating_system), flush=True)\n except Exception as e:\n print(' ERROR processing {} {}: {}'.format(arch, operating_system, str(e)), flush=True)\n\nprint('All symlinks created. {} background threads creating archives...'.format(len(archive_threads)), flush=True)\n\nfor root, directories, filenames in os.walk(temp_dir):\n root_link = os.path.relpath(temp_dir, os.path.join(root, 'child')).replace(os.path.sep, '/')\n for directory in directories:\n write_index(\n path=os.path.join(root, directory, 'index.html'),\n message='\u003cp\u003eDirectory listings are disabled. See \u003ca href=\"{}\"\u003ehere\u003c/a\u003e for available content.\u003c/p\u003e'.format(root_link),\n )\n\nwrite_index(\n path=os.path.join(temp_dir, 'index.html'),\n message='\\n'.join(\n ['\u003cp\u003e\u003cem\u003eNote: Archive files (.tar, .zip) are generated on server startup and may take a few moments to become available.\u003c/em\u003e\u003c/p\u003e'] +\n ['\u003cul\u003e'] +\n [' \u003cli\u003e{}\u003c/li\u003e'.format(entry) for entry in content] +\n ['\u003c/ul\u003e']\n ),\n)\n\n# Create socket\n# IPv6 should handle IPv4 passively so long as it is not bound to a\n# specific address or set to IPv6_ONLY\n# https://stackoverflow.com/questions/25817848/python-3-does-http-server-support-ipv6\ntry:\n addr = ('::', 8080)\n sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)\nexcept socket.error as err:\n # errno.EAFNOSUPPORT is \"socket.error: [Errno 97] Address family not supported by protocol\"\n # When IPv6 is disabled, socket will bind using IPv4.\n if err.errno == errno.EAFNOSUPPORT:\n addr = ('', 8080)\n sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n else:\n raise \nsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\nprint('Binding to {}...'.format(addr), flush=True)\nsock.bind(addr)\nsock.listen(5)\n\nprint('Starting 100 worker threads...', flush=True)\n[Thread(i, socket=sock) for i in range(100)]\nprint('Server ready on port 8080!', flush=True)\ntime.sleep(9e9)\nEOF\nexec python3 /tmp/serve.py\n" ], "ports": [ { "name": "http", "containerPort": 8080, "protocol": "TCP" } ], "resources": { "requests": { "cpu": "10m", "memory": "50Mi" } }, "volumeMounts": [ { "name": "kube-api-access-qj2gh", "readOnly": true, "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount" } ], "livenessProbe": { "httpGet": { "path": "/", "port": 8080, "scheme": "HTTP" }, "timeoutSeconds": 1, "periodSeconds": 10, "successThreshold": 1, "failureThreshold": 3 }, "readinessProbe": { "httpGet": { "path": "/", "port": 8080, "scheme": "HTTP" }, "timeoutSeconds": 1, "periodSeconds": 10, "successThreshold": 1, "failureThreshold": 3 }, "terminationMessagePath": "/dev/termination-log", "terminationMessagePolicy": "FallbackToLogsOnError", "imagePullPolicy": "IfNotPresent", "securityContext": { "capabilities": { "drop": [ "ALL" ] }, "runAsUser": 1000700000, "readOnlyRootFilesystem": false, "allowPrivilegeEscalation": false } } ], "restartPolicy": "Always", "terminationGracePeriodSeconds": 5, "dnsPolicy": "ClusterFirst", "nodeSelector": { "kubernetes.io/os": "linux", "node-role.kubernetes.io/master": "" }, "serviceAccountName": "default", "serviceAccount": "default", "nodeName": "master-0", "securityContext": { "seLinuxOptions": { "level": "s0:c26,c25" }, "runAsNonRoot": true, "fsGroup": 1000700000, "seccompProfile": { "type": "RuntimeDefault" } }, "imagePullSecrets": [ { "name": "default-dockercfg-k7bb9" } ], "affinity": {}, "schedulerName": "default-scheduler", "tolerations": [ { "key": "node-role.kubernetes.io/master", "operator": "Exists", "effect": "NoSchedule" }, { "key": "node.kubernetes.io/unreachable", "operator": "Exists", "effect": "NoExecute", "tolerationSeconds": 120 }, { "key": "node.kubernetes.io/not-ready", "operator": "Exists", "effect": "NoExecute", "tolerationSeconds": 300 }, { "key": "node.kubernetes.io/memory-pressure", "operator": "Exists", "effect": "NoSchedule" } ], "priorityClassName": "system-cluster-critical", "priority": 2000000000, "enableServiceLinks": true, "preemptionPolicy": "PreemptLowerPriority" }, "status": { "phase": "Running", "conditions": [ { "type": "PodReadyToStartContainers", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2026-03-01T11:52:25Z" }, { "type": "Initialized", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2026-03-01T11:10:22Z" }, { "type": "Ready", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2026-03-01T11:52:26Z" }, { "type": "ContainersReady", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2026-03-01T11:52:26Z" }, { "type": "PodScheduled", "status": "True", "lastProbeTime": null, "lastTransitionTime": "2026-03-01T11:10:22Z" } ], "hostIP": "193.176.244.127", "hostIPs": [ { "ip": "193.176.244.127" } ], "podIP": "10.128.0.173", "podIPs": [ { "ip": "10.128.0.173" } ], "startTime": "2026-03-01T11:10:22Z", "containerStatuses": [ { "name": "download-server", "state": { "running": { "startedAt": "2026-03-01T11:52:24Z" } }, "lastState": {}, "ready": true, "restartCount": 1, "image": "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:7aca367821614925d35e1b466169afbd7812a3cbceac19dbd8be18aef943a272", "imageID": "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:7aca367821614925d35e1b466169afbd7812a3cbceac19dbd8be18aef943a272", "containerID": "cri-o://bc4bddd80f6337462a1238e3b3fee45d1a63bc8a6224567342c12fc2ebf96272", "started": true, "allocatedResources": { "cpu": "10m", "memory": "50Mi" }, "resources": { "requests": { "cpu": "10m", "memory": "50Mi" } }, "volumeMounts": [ { "name": "kube-api-access-qj2gh", "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", "readOnly": true, "recursiveReadOnly": "Disabled" } ], "user": { "linux": { "uid": 1000700000, "gid": 0, "supplementalGroups": [ 0, 1000700000 ] } } } ], "qosClass": "Burstable" } }