diff --git a/specification/kubernetesconfiguration/cspell.yaml b/specification/kubernetesconfiguration/cspell.yaml index d2472a474f77..a8a61b3ed862 100644 --- a/specification/kubernetesconfiguration/cspell.yaml +++ b/specification/kubernetesconfiguration/cspell.yaml @@ -8,10 +8,21 @@ version: '0.2' import: - ../../cspell.yaml words: + - armkubernetesresources + - armupgradeassessments + - gvisor + - healthz + - kata - kubernetesconfiguration + - kubernetesresources + - kubelet - kustomization - kustomizations - kustomize + - millicores + - Misscheduled - oidc + - readyz - rpns + - upgradeassessments diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/KubernetesResource.tsp b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/KubernetesResource.tsp new file mode 100644 index 000000000000..a77e1c267d35 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/KubernetesResource.tsp @@ -0,0 +1,94 @@ +import "@azure-tools/typespec-azure-core"; +import "@azure-tools/typespec-azure-resource-manager"; +import "@typespec/rest"; +import "./models.tsp"; + +using TypeSpec.Rest; +using Azure.Core; +using Azure.ResourceManager; +using Azure.ResourceManager.Foundations; +using TypeSpec.Http; + +namespace Microsoft.KubernetesConfiguration; + +/** + * Singleton container resource grouping cluster inventory reports. + */ +model KubernetesResource + is Azure.ResourceManager.ProxyResource { + ...ResourceNameParameter< + Resource = KubernetesResource, + KeyName = "kubernetesResourceName", + SegmentName = "kubernetesResources", + NamePattern = "^[a-z]([a-z0-9._-]{0,126}[a-z0-9])?$" + >; +} + +/** + * Operations alias for KubernetesResources using the cluster extension routing pattern. + * Generates URLs of the form: + * /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{clusterRp}/{clusterResourceName}/{clusterName}/providers/Microsoft.KubernetesConfiguration/kubernetesResources[/{kubernetesResourceName}] + */ +alias KubernetesResourceOps = Azure.ResourceManager.Legacy.ExtensionOperations< + { + ...ApiVersionParameter; + ...SubscriptionIdParameter; + ...ResourceGroupParameter; + + /** + * The Kubernetes cluster RP - i.e. Microsoft.ContainerService, Microsoft.Kubernetes, + * Microsoft.HybridContainerService, Microsoft.KubernetesConfiguration. + */ + @path + @segment("providers") + @key + @pattern("^Microsoft\\.(ContainerService|Kubernetes|HybridContainerService|KubernetesConfiguration)$") + clusterRp: string; + + /** + * The Kubernetes cluster resource name - i.e. managedClusters, connectedClusters, + * provisionedClusters, appliances. + */ + @key + @path + @pattern("^[a-zA-Z]+$") + clusterResourceName: string; + + /** + * The name of the kubernetes cluster. + */ + @key + @path + @pattern("^[a-zA-Z0-9][a-zA-Z0-9-_.]{0,62}$") + clusterName: string; + }, + { + ...Azure.ResourceManager.Extension.ExtensionProviderNamespace; + ...ParentKeysOf; + }, + { + ...Azure.ResourceManager.Extension.ExtensionProviderNamespace; + ...KeysOf; + } +>; + +@armResourceOperations(#{ allowStaticRoutes: true, omitTags: true }) +interface KubernetesResources { + /** + * Get the kubernetesResources singleton for a cluster. + */ + @tag("KubernetesResources") + get is KubernetesResourceOps.Read; + + /** + * List kubernetesResources containers for the cluster (currently always a single 'default'). + */ + @tag("KubernetesResources") + list is KubernetesResourceOps.List; +} + +@@doc(KubernetesResource.name, "Name of the KubernetesResources resource."); +@@doc( + KubernetesResource.properties, + "Properties of the KubernetesResources resource." +); diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-CSIStorageCapacity.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-CSIStorageCapacity.json new file mode 100644 index 000000000000..b300a84a4d69 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-CSIStorageCapacity.json @@ -0,0 +1,64 @@ +{ + "title": "Get KubernetesResources - CSIStorageCapacity", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "csistoragecapacity-managed-premium-pool1-kube-system", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/csistoragecapacity-managed-premium-pool1-kube-system", + "name": "csistoragecapacity-managed-premium-pool1-kube-system", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "storage.k8s.io/v1", + "kind": "CSIStorageCapacity", + "metadata": { + "name": "managed-premium-pool1", + "namespaceName": "kube-system", + "uid": "a7b8c9d0-e1f2-3456-abcd-789012345678", + "resourceVersion": "4567890", + "generation": 1, + "creationTimestamp": "2026-04-01T06:00:00Z", + "labels": [ + { + "name": "csi.storage.k8s.io/storageclass", + "value": "managed-premium" + } + ] + }, + "spec": { + "storageClassName": "managed-premium", + "storageCapacityAvailable": "512Gi", + "maximumVolumeSize": "4Ti", + "additionalFields": [ + { + "name": "nodeTopology.matchLabels.topology.kubernetes.io/zone", + "value": "eastus-1" + }, + { + "name": "nodeTopology.matchLabels.kubernetes.io/hostname", + "value": "aks-nodepool1-12345678-vmss000000" + } + ] + }, + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-CertificateSigningRequest.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-CertificateSigningRequest.json new file mode 100644 index 000000000000..8d22cc009631 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-CertificateSigningRequest.json @@ -0,0 +1,78 @@ +{ + "title": "Get KubernetesResources - CertificateSigningRequest", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "certificatesigningrequest-myapp-node-client", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/certificatesigningrequest-myapp-node-client", + "name": "certificatesigningrequest-myapp-node-client", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "certificates.k8s.io/v1", + "kind": "CertificateSigningRequest", + "metadata": { + "name": "myapp-node-client", + "uid": "f6a7b8c9-d0e1-2345-fabc-678901234567", + "resourceVersion": "3456789", + "generation": 1, + "creationTimestamp": "2026-05-20T09:30:00Z", + "labels": [ + { + "name": "app", + "value": "myapp" + } + ] + }, + "spec": { + "csrSignerName": "kubernetes.io/kube-apiserver-client", + "csrUsername": "system:serviceaccount:default:myapp-sa", + "csrUsages": [ + "client auth", + "digital signature", + "key encipherment" + ], + "csrExpirationSeconds": 86400 + }, + "status": { + "conditions": [ + { + "type": "Approved", + "status": "True", + "reason": "KubectlApprove", + "message": "This CSR was approved by kubectl certificate approve.", + "lastTransitionTime": "2026-05-20T09:31:00Z" + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "CertificateIssued", + "age": "16d", + "from": "certificatesigningrequest-controller", + "message": "Signed certificate from signer kubernetes.io/kube-apiserver-client" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ConfigMap.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ConfigMap.json new file mode 100644 index 000000000000..654cb8053d11 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ConfigMap.json @@ -0,0 +1,84 @@ +{ + "title": "Get KubernetesResources - ConfigMap", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "configmap-app-config-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/configmap-app-config-default", + "name": "configmap-app-config-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "app-config", + "namespaceName": "default", + "uid": "d4e5f6a7-b8c9-0123-defa-456789012345", + "resourceVersion": "1234567", + "generation": 1, + "creationTimestamp": "2026-05-01T12:00:00Z", + "labels": [ + { + "name": "app", + "value": "myapp" + }, + { + "name": "environment", + "value": "production" + } + ], + "annotations": [ + { + "name": "kubectl.kubernetes.io/last-applied-configuration", + "value": "{}" + } + ] + }, + "spec": { + "configMapData": [ + { + "name": "DATABASE_HOST", + "value": "postgres.default.svc.cluster.local" + }, + { + "name": "DATABASE_PORT", + "value": "5432" + }, + { + "name": "LOG_LEVEL", + "value": "info" + }, + { + "name": "FEATURE_FLAGS", + "value": "feature-a=true,feature-b=false" + } + ], + "configMapBinaryDataKeys": [ + "tls.crt", + "tls.key" + ], + "configMapImmutable": false + }, + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-CronJob.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-CronJob.json new file mode 100644 index 000000000000..ac9c83335905 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-CronJob.json @@ -0,0 +1,99 @@ +{ + "title": "Get KubernetesResources - CronJob", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "cronjob-report-generator-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/cronjob-report-generator-default", + "name": "cronjob-report-generator-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "batch/v1", + "kind": "CronJob", + "metadata": { + "name": "report-generator", + "namespaceName": "default", + "uid": "c9d0e1f2-a3b4-5678-cdef-890123456789", + "resourceVersion": "8901234", + "generation": 3, + "creationTimestamp": "2026-01-05T00:00:00Z", + "labels": [ + { + "name": "app", + "value": "report-generator" + } + ] + }, + "spec": { + "schedule": "0 2 * * *", + "concurrencyPolicy": "Forbid", + "suspend": false, + "timeZone": "America/New_York", + "startingDeadlineSeconds": 60, + "completions": 1, + "parallelism": 1, + "backoffLimit": 2, + "containers": [ + { + "name": "reporter", + "image": "myapp/reporter:latest", + "imagePullPolicy": "Always", + "envFrom": [ + { + "configMapRef": "report-config" + }, + { + "secretRef": "report-credentials" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + }, + "limits": { + "cpu": "1000m", + "memory": "1Gi" + } + } + } + ] + }, + "status": { + "lastScheduleTime": "2026-06-04T02:00:00Z", + "lastSuccessfulTime": "2026-06-04T02:03:45Z", + "activeJobCount": 0, + "conditions": [] + }, + "events": [ + { + "type": "Normal", + "reason": "SuccessfulCreate", + "age": "1d", + "from": "cronjob-controller", + "message": "Created job report-generator-28651200" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-DaemonSet.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-DaemonSet.json new file mode 100644 index 000000000000..519568082224 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-DaemonSet.json @@ -0,0 +1,157 @@ +{ + "title": "Get KubernetesResources - DaemonSet", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "daemonset-kube-proxy-kube-system", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/daemonset-kube-proxy-kube-system", + "name": "daemonset-kube-proxy-kube-system", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "apps/v1", + "kind": "DaemonSet", + "metadata": { + "name": "kube-proxy", + "namespaceName": "kube-system", + "uid": "a1b2c3d4-e5f6-7890-bcde-f01234567890", + "resourceVersion": "12345", + "generation": 1, + "creationTimestamp": "2026-01-01T00:00:00Z", + "labels": [ + { + "name": "k8s-app", + "value": "kube-proxy" + }, + { + "name": "component", + "value": "kube-proxy" + } + ] + }, + "spec": { + "selector": [ + { + "name": "k8s-app", + "value": "kube-proxy" + } + ], + "strategyType": "RollingUpdate", + "maxUnavailable": "1", + "serviceAccountName": "kube-proxy", + "tolerations": [ + { + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "effect": "NoSchedule" + }, + { + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "effect": "NoSchedule" + }, + { + "key": "node.kubernetes.io/disk-pressure", + "operator": "Exists", + "effect": "NoSchedule" + }, + { + "key": "node.kubernetes.io/memory-pressure", + "operator": "Exists", + "effect": "NoSchedule" + }, + { + "key": "node.kubernetes.io/unschedulable", + "operator": "Exists", + "effect": "NoSchedule" + } + ], + "volumes": [ + { + "name": "kube-proxy", + "sourceType": "configMap", + "source": "kube-proxy" + }, + { + "name": "xtables-lock", + "sourceType": "hostPath", + "source": "/run/xtables.lock" + }, + { + "name": "lib-modules", + "sourceType": "hostPath", + "source": "/lib/modules" + } + ], + "containers": [ + { + "name": "kube-proxy", + "image": "registry.k8s.io/kube-proxy:v1.29.0", + "imagePullPolicy": "IfNotPresent", + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + } + }, + "volumeMounts": [ + { + "name": "kube-proxy", + "mountPath": "/var/lib/kube-proxy" + }, + { + "name": "xtables-lock", + "mountPath": "/run/xtables.lock" + }, + { + "name": "lib-modules", + "mountPath": "/lib/modules", + "readOnly": true + } + ], + "securityContext": { + "privileged": true + } + } + ] + }, + "status": { + "desiredNumberScheduled": 3, + "currentNumberScheduled": 3, + "numberReady": 3, + "numberMisscheduled": 0, + "numberUnavailable": 0, + "availableReplicas": 3, + "updatedReplicas": 3, + "observedGeneration": 1, + "conditions": [ + { + "type": "Available", + "status": "True", + "lastTransitionTime": "2026-01-01T00:02:00Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Deployment.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Deployment.json new file mode 100644 index 000000000000..a5e4888279ac --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Deployment.json @@ -0,0 +1,190 @@ +{ + "title": "Get KubernetesResources - Deployment", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "deployment-nginx-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/deployment-nginx-default", + "name": "deployment-nginx-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "nginx", + "namespaceName": "default", + "uid": "b1c2d3e4-f5a6-7890-bcde-f12345678901", + "resourceVersion": "9012345", + "generation": 3, + "creationTimestamp": "2026-04-15T09:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + }, + { + "name": "version", + "value": "1.25" + } + ], + "annotations": [ + { + "name": "deployment.kubernetes.io/revision", + "value": "3" + } + ] + }, + "spec": { + "replicas": 3, + "selector": [ + { + "name": "app", + "value": "nginx" + } + ], + "strategyType": "RollingUpdate", + "maxUnavailable": "25%", + "maxSurge": "25%", + "serviceAccountName": "nginx-sa", + "priorityClassName": "high-priority", + "nodeSelector": [ + { + "name": "kubernetes.io/os", + "value": "linux" + } + ], + "securityContext": { + "runAsNonRoot": true, + "runAsUser": 1000, + "fsGroup": 2000, + "seccompProfile": "RuntimeDefault", + "appArmorProfile": "RuntimeDefault" + }, + "tolerations": [ + { + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "nginx-config", + "sourceType": "configMap", + "source": "nginx-config" + } + ], + "containers": [ + { + "name": "nginx", + "image": "nginx:1.25.4", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "http", + "containerPort": 80, + "protocol": "TCP" + } + ], + "env": [ + { + "name": "ENV", + "value": "production" + } + ], + "envFrom": [ + { + "configMapRef": "app-config" + }, + { + "secretRef": "app-secrets", + "prefix": "SECRET_" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + }, + "limits": { + "cpu": "500m", + "memory": "512Mi" + } + }, + "volumeMounts": [ + { + "name": "nginx-config", + "mountPath": "/etc/nginx/conf.d", + "readOnly": true + } + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "privileged": false, + "capabilities": { + "drop": [ + "ALL" + ] + } + } + } + ] + }, + "status": { + "replicas": 3, + "readyReplicas": 3, + "availableReplicas": 3, + "updatedReplicas": 3, + "unavailableReplicas": 0, + "observedGeneration": 3, + "conditions": [ + { + "type": "Available", + "status": "True", + "reason": "MinimumReplicasAvailable", + "message": "Deployment has minimum availability.", + "lastTransitionTime": "2026-04-15T09:01:30Z" + }, + { + "type": "Progressing", + "status": "True", + "reason": "NewReplicaSetAvailable", + "message": "ReplicaSet \"nginx-7d9f8c\" has successfully progressed.", + "lastTransitionTime": "2026-04-15T09:01:30Z" + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "ScalingReplicaSet", + "age": "50d", + "from": "deployment-controller", + "message": "Scaled up replica set nginx-7d9f8c to 3" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-EndpointSlice.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-EndpointSlice.json new file mode 100644 index 000000000000..99a44d336b00 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-EndpointSlice.json @@ -0,0 +1,108 @@ +{ + "title": "Get KubernetesResources - EndpointSlice", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "endpointslice-myapp-abc12-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/endpointslice-myapp-abc12-default", + "name": "endpointslice-myapp-abc12-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "discovery.k8s.io/v1", + "kind": "EndpointSlice", + "metadata": { + "name": "myapp-abc12", + "namespaceName": "default", + "uid": "e5f6a7b8-c9d0-1234-efab-567890123456", + "resourceVersion": "2345678", + "generation": 1, + "creationTimestamp": "2026-05-10T14:00:00Z", + "labels": [ + { + "name": "kubernetes.io/service-name", + "value": "myapp" + }, + { + "name": "endpointslice.kubernetes.io/managed-by", + "value": "endpointslice-controller.k8s.io" + } + ], + "ownerReferences": [ + { + "apiVersion": "v1", + "kind": "Service", + "name": "myapp", + "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" + } + ] + }, + "spec": { + "endpointSliceAddressType": "IPv4", + "endpointSliceEndpoints": [ + { + "addresses": [ + "10.244.1.5" + ], + "ready": true, + "nodeName": "aks-nodepool1-12345678-vmss000000", + "targetRefKind": "Pod", + "targetRefName": "myapp-6d8f9c-xk2pv", + "targetRefNamespace": "default" + }, + { + "addresses": [ + "10.244.2.8" + ], + "ready": true, + "nodeName": "aks-nodepool1-12345678-vmss000001", + "targetRefKind": "Pod", + "targetRefName": "myapp-6d8f9c-mn7qr", + "targetRefNamespace": "default" + }, + { + "addresses": [ + "10.244.3.12" + ], + "ready": false, + "nodeName": "aks-nodepool1-12345678-vmss000002", + "targetRefKind": "Pod", + "targetRefName": "myapp-6d8f9c-pz4st", + "targetRefNamespace": "default" + } + ], + "endpointSlicePorts": [ + { + "port": 8080, + "protocol": "TCP", + "name": "http" + }, + { + "port": 8443, + "protocol": "TCP", + "name": "https" + } + ] + }, + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-HorizontalPodAutoscaler.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-HorizontalPodAutoscaler.json new file mode 100644 index 000000000000..30ba9a88c27b --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-HorizontalPodAutoscaler.json @@ -0,0 +1,110 @@ +{ + "title": "Get KubernetesResources - HorizontalPodAutoscaler", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "horizontalpodautoscaler-nginx-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/horizontalpodautoscaler-nginx-default", + "name": "horizontalpodautoscaler-nginx-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "autoscaling/v2", + "kind": "HorizontalPodAutoscaler", + "metadata": { + "name": "nginx-hpa", + "namespaceName": "default", + "uid": "e7f8a9b0-c1d2-3456-efab-678901234567", + "resourceVersion": "1578901", + "creationTimestamp": "2026-04-20T10:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + } + ] + }, + "spec": { + "scaleTargetRefKind": "Deployment", + "scaleTargetRefName": "nginx", + "minReplicas": 2, + "maxReplicas": 10, + "additionalFields": [ + { + "name": "metrics[0].type", + "value": "Resource" + }, + { + "name": "metrics[0].resource.name", + "value": "cpu" + }, + { + "name": "metrics[0].resource.target.type", + "value": "Utilization" + }, + { + "name": "metrics[0].resource.target.averageUtilization", + "value": "70" + }, + { + "name": "metrics[1].type", + "value": "Resource" + }, + { + "name": "metrics[1].resource.name", + "value": "memory" + }, + { + "name": "metrics[1].resource.target.type", + "value": "Utilization" + }, + { + "name": "metrics[1].resource.target.averageUtilization", + "value": "80" + } + ] + }, + "status": { + "currentReplicas": 3, + "desiredReplicas": 3, + "lastScaleTime": "2026-04-20T10:00:00Z", + "conditions": [ + { + "type": "AbleToScale", + "status": "True", + "reason": "ReadyForNewScale", + "message": "recommended size matches current size", + "lastTransitionTime": "2026-04-20T10:01:00Z" + }, + { + "type": "ScalingActive", + "status": "True", + "reason": "ValidMetricFound", + "message": "the HPA was able to successfully calculate a replica count", + "lastTransitionTime": "2026-04-20T10:01:00Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Ingress.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Ingress.json new file mode 100644 index 000000000000..8585220fe5f0 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Ingress.json @@ -0,0 +1,105 @@ +{ + "title": "Get KubernetesResources - Ingress", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "ingress-myapp-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/ingress-myapp-default", + "name": "ingress-myapp-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "networking.k8s.io/v1", + "kind": "Ingress", + "metadata": { + "name": "myapp", + "namespaceName": "default", + "uid": "a3b4c5d6-e7f8-9012-abcd-234567890123", + "resourceVersion": "1134567", + "creationTimestamp": "2026-04-01T08:00:00Z", + "labels": [ + { + "name": "app", + "value": "myapp" + } + ], + "annotations": [ + { + "name": "nginx.ingress.kubernetes.io/rewrite-target", + "value": "/" + }, + { + "name": "nginx.ingress.kubernetes.io/ssl-redirect", + "value": "true" + } + ] + }, + "spec": { + "ingressClassName": "nginx", + "defaultBackendServiceName": "default-backend", + "defaultBackendServicePort": "80", + "ingressRules": [ + { + "host": "myapp.example.com", + "paths": [ + { + "path": "/api", + "pathType": "Prefix", + "serviceName": "myapp-api", + "servicePort": "8080" + }, + { + "path": "/", + "pathType": "Prefix", + "serviceName": "myapp-frontend", + "servicePort": "80" + } + ] + } + ], + "ingressTls": [ + { + "hosts": [ + "myapp.example.com" + ], + "secretName": "myapp-tls-cert" + } + ] + }, + "status": { + "loadBalancerIngress": [ + "203.0.113.10" + ], + "conditions": [] + }, + "events": [ + { + "type": "Normal", + "reason": "Sync", + "age": "1h", + "from": "nginx-ingress-controller", + "message": "Scheduled for sync" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-IngressClass.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-IngressClass.json new file mode 100644 index 000000000000..1ba627df1796 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-IngressClass.json @@ -0,0 +1,68 @@ +{ + "title": "Get KubernetesResources - IngressClass", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "ingressclass-nginx", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/ingressclass-nginx", + "name": "ingressclass-nginx", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "networking.k8s.io/v1", + "kind": "IngressClass", + "metadata": { + "name": "nginx", + "uid": "a3b4c5d6-e7f8-9012-abcd-456789012345", + "resourceVersion": "9345678", + "creationTimestamp": "2026-01-10T07:30:00Z", + "labels": [ + { + "name": "app.kubernetes.io/component", + "value": "controller" + }, + { + "name": "app.kubernetes.io/instance", + "value": "ingress-nginx" + }, + { + "name": "app.kubernetes.io/name", + "value": "ingress-nginx" + } + ], + "annotations": [ + { + "name": "ingressclass.kubernetes.io/is-default-class", + "value": "true" + } + ] + }, + "spec": { + "ingressController": "k8s.io/ingress-nginx" + }, + "status": { + "conditions": [] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Job.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Job.json new file mode 100644 index 000000000000..59c73ec2133e --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Job.json @@ -0,0 +1,128 @@ +{ + "title": "Get KubernetesResources - Job", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "job-db-migration-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/job-db-migration-default", + "name": "job-db-migration-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "batch/v1", + "kind": "Job", + "metadata": { + "name": "db-migration", + "namespaceName": "default", + "uid": "b8c9d0e1-f2a3-4567-bcde-789012345678", + "resourceVersion": "7890123", + "generation": 1, + "creationTimestamp": "2026-06-01T06:00:00Z", + "labels": [ + { + "name": "app", + "value": "db-migration" + }, + { + "name": "batch.kubernetes.io/job-name", + "value": "db-migration" + } + ] + }, + "spec": { + "completions": 1, + "parallelism": 1, + "backoffLimit": 3, + "suspend": false, + "activeDeadlineSeconds": 600, + "completionMode": "NonIndexed", + "ttlSecondsAfterFinished": 3600, + "serviceAccountName": "migration-sa", + "containers": [ + { + "name": "migration", + "image": "myapp/migration:v2.3.0", + "imagePullPolicy": "Always", + "envFrom": [ + { + "secretRef": "db-credentials" + }, + { + "configMapRef": "migration-config" + } + ], + "resources": { + "requests": { + "cpu": "200m", + "memory": "256Mi" + }, + "limits": { + "cpu": "500m", + "memory": "512Mi" + } + }, + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "privileged": false, + "runAsNonRoot": true, + "runAsUser": 1000 + } + } + ] + }, + "status": { + "activeJobCount": 0, + "succeededJobCount": 1, + "failedJobCount": 0, + "readyPods": 0, + "jobStartTime": "2026-06-01T06:00:05Z", + "jobCompletionTime": "2026-06-01T06:02:30Z", + "conditions": [ + { + "type": "Complete", + "status": "True", + "reason": "Completed", + "message": "Job completed successfully", + "lastTransitionTime": "2026-06-01T06:02:30Z" + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "SuccessfulCreate", + "age": "3d", + "from": "job-controller", + "message": "Created pod: db-migration-xk9p2" + }, + { + "type": "Normal", + "reason": "Completed", + "age": "3d", + "from": "job-controller", + "message": "Job completed" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-NetworkPolicy.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-NetworkPolicy.json new file mode 100644 index 000000000000..12821dd35be1 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-NetworkPolicy.json @@ -0,0 +1,88 @@ +{ + "title": "Get KubernetesResources - NetworkPolicy", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "networkpolicy-deny-external-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/networkpolicy-deny-external-default", + "name": "networkpolicy-deny-external-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "networking.k8s.io/v1", + "kind": "NetworkPolicy", + "metadata": { + "name": "deny-external", + "namespaceName": "default", + "uid": "b4c5d6e7-f8a9-0123-bcde-345678901234", + "resourceVersion": "1245678", + "creationTimestamp": "2026-02-15T12:00:00Z", + "labels": [ + { + "name": "policy-type", + "value": "isolation" + } + ] + }, + "spec": { + "podSelectorLabels": [ + { + "name": "app", + "value": "myapp" + } + ], + "networkPolicyTypes": [ + "Ingress", + "Egress" + ], + "additionalFields": [ + { + "name": "ingress[0].from[0].podSelector.matchLabels.app", + "value": "frontend" + }, + { + "name": "ingress[0].ports[0].port", + "value": "8080" + }, + { + "name": "ingress[0].ports[0].protocol", + "value": "TCP" + }, + { + "name": "egress[0].to[0].namespaceSelector.matchLabels.name", + "value": "kube-system" + }, + { + "name": "egress[0].ports[0].port", + "value": "53" + }, + { + "name": "egress[0].ports[0].protocol", + "value": "UDP" + } + ] + }, + "status": {}, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Node.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Node.json new file mode 100644 index 000000000000..6a3d8f0d39fe --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Node.json @@ -0,0 +1,155 @@ +{ + "title": "Get KubernetesResources - Node", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "node-aks-nodepool1-12345678-0", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/node-aks-nodepool1-12345678-0", + "name": "node-aks-nodepool1-12345678-0", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "Node", + "metadata": { + "name": "aks-nodepool1-12345678-0", + "uid": "a7b8c9d0-e1f2-3456-abcd-678901234567", + "resourceVersion": "6789012", + "creationTimestamp": "2026-01-10T07:00:00Z", + "labels": [ + { + "name": "kubernetes.io/os", + "value": "linux" + }, + { + "name": "kubernetes.io/arch", + "value": "amd64" + }, + { + "name": "node.kubernetes.io/instance-type", + "value": "Standard_D4s_v3" + }, + { + "name": "topology.kubernetes.io/zone", + "value": "eastus-1" + }, + { + "name": "agentpool", + "value": "nodepool1" + } + ], + "annotations": [ + { + "name": "node.alpha.kubernetes.io/ttl", + "value": "0" + }, + { + "name": "volumes.kubernetes.io/controller-managed-attach-detach", + "value": "true" + } + ] + }, + "spec": { + "providerId": "azure:///subscriptions/subId1/resourceGroups/mc_rg1_clusterName1_eastus/providers/Microsoft.Compute/virtualMachines/aks-nodepool1-12345678-0", + "podCidr": "10.244.0.0/24", + "unschedulable": false, + "taints": [ + { + "key": "node.kubernetes.io/memory-pressure", + "effect": "PreferNoSchedule" + } + ] + }, + "status": { + "nodeAddresses": [ + { + "type": "InternalIP", + "address": "10.240.0.4" + }, + { + "type": "Hostname", + "address": "aks-nodepool1-12345678-0" + } + ], + "nodeInfo": { + "kernelVersion": "5.15.0-1057-azure", + "osImage": "Ubuntu 22.04.4 LTS", + "containerRuntimeVersion": "containerd://1.7.13", + "kubeletVersion": "v1.29.2", + "kubeProxyVersion": "v1.29.2", + "architecture": "amd64", + "operatingSystem": "linux" + }, + "nodeCapacity": { + "cpu": "4", + "memory": "16Gi", + "pods": "110", + "ephemeralStorage": "119Gi" + }, + "nodeAllocatable": { + "cpu": "3850m", + "memory": "14902Mi", + "pods": "110", + "ephemeralStorage": "109Gi" + }, + "volumesAttached": [ + { + "name": "kubernetes-dynamic-pvc-a1b2c3d4", + "devicePath": "/dev/sdc" + }, + { + "name": "kubernetes-dynamic-pvc-e5f6a7b8", + "devicePath": "/dev/sdd" + } + ], + "conditions": [ + { + "type": "MemoryPressure", + "status": "False", + "reason": "KubeletHasSufficientMemory", + "lastTransitionTime": "2026-01-10T07:01:00Z" + }, + { + "type": "DiskPressure", + "status": "False", + "reason": "KubeletHasNoDiskPressure", + "lastTransitionTime": "2026-01-10T07:01:00Z" + }, + { + "type": "PIDPressure", + "status": "False", + "reason": "KubeletHasSufficientPID", + "lastTransitionTime": "2026-01-10T07:01:00Z" + }, + { + "type": "Ready", + "status": "True", + "reason": "KubeletReady", + "message": "kubelet is posting ready status", + "lastTransitionTime": "2026-01-10T07:01:30Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-PersistentVolume.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-PersistentVolume.json new file mode 100644 index 000000000000..aa822cfed8ac --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-PersistentVolume.json @@ -0,0 +1,64 @@ +{ + "title": "Get KubernetesResources - PersistentVolume", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "persistentvolume-pvc-d0e1f2a3-b4c5-6789-defa", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/persistentvolume-pvc-d0e1f2a3-b4c5-6789-defa", + "name": "persistentvolume-pvc-d0e1f2a3-b4c5-6789-defa", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "PersistentVolume", + "metadata": { + "name": "pvc-d0e1f2a3-b4c5-6789-defa-901234567890", + "uid": "e1f2a3b4-c5d6-7890-efab-012345678901", + "resourceVersion": "9123456", + "creationTimestamp": "2026-03-01T10:00:05Z", + "labels": [ + { + "name": "failure-domain.beta.kubernetes.io/zone", + "value": "eastus-1" + } + ] + }, + "spec": { + "storageCapacity": "50Gi", + "accessModes": [ + "ReadWriteOnce" + ], + "reclaimPolicy": "Delete", + "storageClassName": "managed-premium", + "volumeMode": "Filesystem", + "claimRefNamespace": "default", + "boundVolumeName": "data-postgres-0", + "csiDriver": "disk.csi.azure.com", + "csiVolumeHandle": "/subscriptions/subId1/resourceGroups/mc_rg1_clusterName1_eastus/providers/Microsoft.Compute/disks/pvc-d0e1f2a3-b4c5-6789-defa-901234567890" + }, + "status": { + "phase": "Bound" + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-PersistentVolumeClaim.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-PersistentVolumeClaim.json new file mode 100644 index 000000000000..85a8f4d7611e --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-PersistentVolumeClaim.json @@ -0,0 +1,70 @@ +{ + "title": "Get KubernetesResources - PersistentVolumeClaim", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "persistentvolumeclaim-data-postgres-0-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/persistentvolumeclaim-data-postgres-0-default", + "name": "persistentvolumeclaim-data-postgres-0-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "PersistentVolumeClaim", + "metadata": { + "name": "data-postgres-0", + "namespaceName": "default", + "uid": "d0e1f2a3-b4c5-6789-defa-901234567890", + "resourceVersion": "9012345", + "creationTimestamp": "2026-03-01T10:00:05Z", + "labels": [ + { + "name": "app", + "value": "postgres" + }, + { + "name": "statefulset.kubernetes.io/pod-name", + "value": "postgres-0" + } + ] + }, + "spec": { + "accessModes": [ + "ReadWriteOnce" + ], + "storageClassName": "managed-premium", + "storageRequest": "50Gi", + "volumeMode": "Filesystem", + "boundVolumeName": "pvc-d0e1f2a3-b4c5-6789-defa-901234567890" + }, + "status": { + "phase": "Bound", + "pvcCapacity": "50Gi", + "pvcAccessModes": [ + "ReadWriteOnce" + ], + "conditions": [] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Pod.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Pod.json new file mode 100644 index 000000000000..30f43f8b4ffc --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Pod.json @@ -0,0 +1,238 @@ +{ + "title": "Get KubernetesResources - Pod", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "pod-coredns-5d78c9869d-r4pzt-kube-system", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/pod-coredns-5d78c9869d-r4pzt-kube-system", + "name": "pod-coredns-5d78c9869d-r4pzt-kube-system", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "name": "coredns-5d78c9869d-r4pzt", + "namespaceName": "kube-system", + "uid": "d4e5f6a7-b8c9-0123-defa-234567890123", + "resourceVersion": "7712091", + "generation": 1, + "creationTimestamp": "2026-04-01T08:05:00Z", + "labels": [ + { + "name": "k8s-app", + "value": "kube-dns" + }, + { + "name": "pod-template-hash", + "value": "5d78c9869d" + } + ], + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "coredns-5d78c9869d", + "uid": "e5f6a7b8-c9d0-1234-efab-345678901234", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "nodeName": "aks-nodepool1-12345678-1", + "restartPolicy": "Always", + "serviceAccountName": "coredns", + "dnsPolicy": "Default", + "terminationGracePeriodSeconds": 30, + "priorityClassName": "system-cluster-critical", + "securityContext": { + "runAsNonRoot": true + }, + "tolerations": [ + { + "key": "CriticalAddonsOnly", + "operator": "Exists" + }, + { + "key": "node-role.kubernetes.io/control-plane", + "operator": "Exists", + "effect": "NoSchedule" + } + ], + "volumes": [ + { + "name": "config-volume", + "sourceType": "configMap", + "source": "coredns" + }, + { + "name": "kube-api-access", + "sourceType": "projected" + } + ], + "containers": [ + { + "name": "coredns", + "image": "registry.k8s.io/coredns/coredns:v1.11.1", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "dns", + "containerPort": 53, + "protocol": "UDP" + }, + { + "name": "dns-tcp", + "containerPort": 53, + "protocol": "TCP" + }, + { + "name": "metrics", + "containerPort": 9153, + "protocol": "TCP" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "70Mi" + }, + "limits": { + "memory": "170Mi" + } + }, + "volumeMounts": [ + { + "name": "config-volume", + "mountPath": "/etc/coredns", + "readOnly": true + }, + { + "name": "kube-api-access", + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "readOnly": true + } + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "capabilities": { + "add": [ + "NET_BIND_SERVICE" + ], + "drop": [ + "ALL" + ] + } + }, + "livenessProbe": { + "type": "HTTPGet", + "path": "/health", + "port": 8080 + }, + "readinessProbe": { + "type": "HTTPGet", + "path": "/ready", + "port": 8181 + } + } + ] + }, + "status": { + "phase": "Running", + "podIp": "10.244.0.3", + "podIps": [ + "10.244.0.3" + ], + "hostIp": "10.240.0.5", + "hostIps": [ + "10.240.0.5" + ], + "startTime": "2026-04-01T08:05:02Z", + "qosClass": "Burstable", + "reason": "", + "initContainerStatuses": [], + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:02Z" + }, + { + "type": "Ready", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:14Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:14Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:00Z" + } + ], + "containerStatuses": [ + { + "name": "coredns", + "ready": true, + "restartCount": 0, + "started": true, + "image": "registry.k8s.io/coredns/coredns:v1.11.1", + "containerId": "containerd://b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3", + "state": { + "running": { + "startedAt": "2026-04-01T08:05:13Z" + } + } + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "Scheduled", + "age": "58d", + "from": "default-scheduler", + "message": "Successfully assigned kube-system/coredns-5d78c9869d-r4pzt to aks-nodepool1-12345678-1" + }, + { + "type": "Normal", + "reason": "Pulled", + "age": "58d", + "from": "kubelet", + "message": "Container image \"registry.k8s.io/coredns/coredns:v1.11.1\" already present on machine" + }, + { + "type": "Normal", + "reason": "Started", + "age": "58d", + "from": "kubelet", + "message": "Started container coredns" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-PodDisruptionBudget.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-PodDisruptionBudget.json new file mode 100644 index 000000000000..0830dd53428e --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-PodDisruptionBudget.json @@ -0,0 +1,73 @@ +{ + "title": "Get KubernetesResources - PodDisruptionBudget", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "poddisruptionbudget-nginx-pdb-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/poddisruptionbudget-nginx-pdb-default", + "name": "poddisruptionbudget-nginx-pdb-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "policy/v1", + "kind": "PodDisruptionBudget", + "metadata": { + "name": "nginx-pdb", + "namespaceName": "default", + "uid": "f8a9b0c1-d2e3-4567-fabc-789012345678", + "resourceVersion": "1689012", + "creationTimestamp": "2026-04-21T09:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + } + ] + }, + "spec": { + "minAvailable": "2", + "serviceSelector": [ + { + "name": "app", + "value": "nginx" + } + ] + }, + "status": { + "currentHealthy": 3, + "desiredHealthy": 2, + "disruptionsAllowed": 1, + "expectedPods": 3, + "conditions": [ + { + "type": "DisruptionAllowed", + "status": "True", + "reason": "SufficientPods", + "message": "3 healthy replicas found, disruption is allowed", + "lastTransitionTime": "2026-04-21T09:01:00Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ReplicaSet.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ReplicaSet.json new file mode 100644 index 000000000000..d7af1faa6cfc --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ReplicaSet.json @@ -0,0 +1,114 @@ +{ + "title": "Get KubernetesResources - ReplicaSet", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "replicaset-nginx-7d9f8c-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/replicaset-nginx-7d9f8c-default", + "name": "replicaset-nginx-7d9f8c-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "metadata": { + "name": "nginx-7d9f8c", + "namespaceName": "default", + "uid": "e4f5a6b7-c8d9-0123-efab-456789012345", + "resourceVersion": "4567890", + "generation": 1, + "creationTimestamp": "2026-04-15T09:00:10Z", + "labels": [ + { + "name": "app", + "value": "nginx" + }, + { + "name": "pod-template-hash", + "value": "7d9f8c" + } + ], + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "Deployment", + "name": "nginx", + "uid": "b1c2d3e4-f5a6-7890-bcde-f12345678901", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "replicas": 3, + "selector": [ + { + "name": "app", + "value": "nginx" + }, + { + "name": "pod-template-hash", + "value": "7d9f8c" + } + ], + "containers": [ + { + "name": "nginx", + "image": "nginx:1.25.4", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "http", + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + }, + "limits": { + "cpu": "500m", + "memory": "512Mi" + } + } + } + ] + }, + "status": { + "replicas": 3, + "readyReplicas": 3, + "availableReplicas": 3, + "observedGeneration": 1, + "conditions": [ + { + "type": "ReplicaFailure", + "status": "False", + "lastTransitionTime": "2026-04-15T09:00:10Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Role.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Role.json new file mode 100644 index 000000000000..f0fe0aad8ef9 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Role.json @@ -0,0 +1,75 @@ +{ + "title": "Get KubernetesResources - Role", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "role-pod-reader-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/role-pod-reader-default", + "name": "role-pod-reader-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "rbac.authorization.k8s.io/v1", + "kind": "Role", + "metadata": { + "name": "pod-reader", + "namespaceName": "default", + "uid": "c5d6e7f8-a9b0-1234-cdef-456789012345", + "resourceVersion": "1356789", + "creationTimestamp": "2026-01-20T14:00:00Z" + }, + "spec": { + "rbacRules": [ + { + "apiGroups": [ + "" + ], + "resources": [ + "pods", + "pods/log" + ], + "verbs": [ + "get", + "list", + "watch" + ] + }, + { + "apiGroups": [ + "apps" + ], + "resources": [ + "deployments", + "replicasets" + ], + "verbs": [ + "get", + "list" + ] + } + ] + }, + "status": {}, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-RoleBinding.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-RoleBinding.json new file mode 100644 index 000000000000..4989fe9bb673 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-RoleBinding.json @@ -0,0 +1,59 @@ +{ + "title": "Get KubernetesResources - RoleBinding", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "rolebinding-read-pods-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/rolebinding-read-pods-default", + "name": "rolebinding-read-pods-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "rbac.authorization.k8s.io/v1", + "kind": "RoleBinding", + "metadata": { + "name": "read-pods", + "namespaceName": "default", + "uid": "d6e7f8a9-b0c1-2345-defa-567890123456", + "resourceVersion": "1467890", + "creationTimestamp": "2026-01-20T14:05:00Z" + }, + "spec": { + "rbacSubjects": [ + { + "kind": "ServiceAccount", + "name": "monitoring-sa", + "namespaceName": "monitoring" + }, + { + "kind": "User", + "name": "alice@example.com" + } + ], + "rbacRoleRefKind": "Role", + "rbacRoleRefName": "pod-reader" + }, + "status": {}, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Service.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Service.json new file mode 100644 index 000000000000..6de92eec1962 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-Service.json @@ -0,0 +1,103 @@ +{ + "title": "Get KubernetesResources - Service", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "service-nginx-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/service-nginx-default", + "name": "service-nginx-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "Service", + "metadata": { + "name": "nginx", + "namespaceName": "default", + "uid": "f5a6b7c8-d9e0-1234-fabc-567890123456", + "resourceVersion": "5678901", + "creationTimestamp": "2026-04-15T09:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + } + ] + }, + "spec": { + "serviceType": "LoadBalancer", + "clusterIp": "10.0.128.45", + "servicePorts": [ + { + "name": "http", + "port": 80, + "targetPort": "http", + "protocol": "TCP" + }, + { + "name": "https", + "port": 443, + "targetPort": "https", + "protocol": "TCP" + } + ], + "serviceSelector": [ + { + "name": "app", + "value": "nginx" + } + ], + "externalTrafficPolicy": "Local", + "loadBalancerClass": "service.beta.kubernetes.io/azure-load-balancer-internal", + "loadBalancerIp": "52.183.12.45" + }, + "status": { + "loadBalancerIngress": [ + "52.183.12.45" + ], + "conditions": [ + { + "type": "Available", + "status": "True", + "lastTransitionTime": "2026-04-15T09:02:00Z" + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "EnsuringLoadBalancer", + "age": "50d", + "from": "service-controller", + "message": "Ensuring load balancer" + }, + { + "type": "Normal", + "reason": "EnsuredLoadBalancer", + "age": "50d", + "from": "service-controller", + "message": "Ensured load balancer" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ServiceAccount.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ServiceAccount.json new file mode 100644 index 000000000000..060e7c2a1537 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ServiceAccount.json @@ -0,0 +1,65 @@ +{ + "title": "Get KubernetesResources - ServiceAccount", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "serviceaccount-coredns-kube-system", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/serviceaccount-coredns-kube-system", + "name": "serviceaccount-coredns-kube-system", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "ServiceAccount", + "metadata": { + "name": "coredns", + "namespaceName": "kube-system", + "uid": "b2c3d4e5-f6a7-8901-bcde-f12345678901", + "resourceVersion": "890123", + "creationTimestamp": "2026-01-01T00:00:00Z", + "labels": [ + { + "name": "k8s-app", + "value": "kube-dns" + }, + { + "name": "kubernetes.io/cluster-service", + "value": "true" + } + ], + "annotations": [ + { + "name": "kubectl.kubernetes.io/last-applied-configuration", + "value": "{}" + } + ] + }, + "spec": { + "automountServiceAccountToken": false + }, + "status": { + "conditions": [] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-StatefulSet.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-StatefulSet.json new file mode 100644 index 000000000000..8b299265f767 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-StatefulSet.json @@ -0,0 +1,170 @@ +{ + "title": "Get KubernetesResources - StatefulSet", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "statefulset-postgres-data", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/statefulset-postgres-data", + "name": "statefulset-postgres-data", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "apps/v1", + "kind": "StatefulSet", + "metadata": { + "name": "postgres", + "namespaceName": "data", + "uid": "c2d3e4f5-a6b7-8901-cdef-234567890123", + "resourceVersion": "7654321", + "generation": 2, + "creationTimestamp": "2026-03-10T08:00:00Z", + "labels": [ + { + "name": "app", + "value": "postgres" + }, + { + "name": "tier", + "value": "database" + } + ] + }, + "spec": { + "replicas": 3, + "serviceName": "postgres-headless", + "selector": [ + { + "name": "app", + "value": "postgres" + } + ], + "strategyType": "RollingUpdate", + "maxUnavailableReplicas": "1", + "podManagementPolicy": "OrderedReady", + "serviceAccountName": "postgres-sa", + "securityContext": { + "runAsUser": 999, + "runAsGroup": 999, + "fsGroup": 999, + "runAsNonRoot": true + }, + "volumes": [ + { + "name": "config", + "sourceType": "configMap", + "source": "postgres-config" + } + ], + "containers": [ + { + "name": "postgres", + "image": "postgres:15.4", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "postgres", + "containerPort": 5432, + "protocol": "TCP" + } + ], + "env": [ + { + "name": "POSTGRES_DB", + "value": "appdb" + } + ], + "envFrom": [ + { + "secretRef": "postgres-credentials" + } + ], + "resources": { + "requests": { + "cpu": "500m", + "memory": "1Gi" + }, + "limits": { + "cpu": "2", + "memory": "4Gi" + } + }, + "volumeMounts": [ + { + "name": "data", + "mountPath": "/var/lib/postgresql/data", + "subPath": "postgres" + }, + { + "name": "config", + "mountPath": "/etc/postgresql", + "readOnly": true + } + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": false, + "privileged": false + } + } + ], + "volumeClaimTemplates": [ + { + "name": "data", + "accessModes": [ + "ReadWriteOnce" + ], + "storageClassName": "managed-premium", + "storageRequest": "20Gi", + "volumeMode": "Filesystem" + } + ] + }, + "status": { + "replicas": 3, + "readyReplicas": 3, + "availableReplicas": 3, + "currentReplicas": 3, + "updatedReplicas": 3, + "currentRevision": "postgres-7d4c9f6b8", + "updateRevision": "postgres-7d4c9f6b8", + "observedGeneration": 2, + "conditions": [ + { + "type": "Available", + "status": "True", + "reason": "MinimumReplicasAvailable", + "lastTransitionTime": "2026-03-10T08:05:00Z" + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "SuccessfulCreate", + "age": "86d", + "from": "statefulset-controller", + "message": "create Pod postgres-0 in StatefulSet postgres successful" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-StorageClass.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-StorageClass.json new file mode 100644 index 000000000000..5c40ecda4f5c --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-StorageClass.json @@ -0,0 +1,69 @@ +{ + "title": "Get KubernetesResources - StorageClass", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "storageclass-managed-premium", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/storageclass-managed-premium", + "name": "storageclass-managed-premium", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "storage.k8s.io/v1", + "kind": "StorageClass", + "metadata": { + "name": "managed-premium", + "uid": "f2a3b4c5-d6e7-8901-fabc-123456789012", + "resourceVersion": "1023456", + "creationTimestamp": "2026-01-10T07:00:10Z", + "annotations": [ + { + "name": "storageclass.kubernetes.io/is-default-class", + "value": "false" + } + ] + }, + "spec": { + "provisioner": "disk.csi.azure.com", + "reclaimPolicy": "Delete", + "volumeBindingMode": "WaitForFirstConsumer", + "allowVolumeExpansion": true, + "additionalFields": [ + { + "name": "parameters.skuName", + "value": "Premium_LRS" + }, + { + "name": "parameters.kind", + "value": "Managed" + }, + { + "name": "parameters.cachingMode", + "value": "ReadOnly" + } + ] + }, + "status": {}, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ValidatingAdmissionPolicy.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ValidatingAdmissionPolicy.json new file mode 100644 index 000000000000..24f337a7345d --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ValidatingAdmissionPolicy.json @@ -0,0 +1,73 @@ +{ + "title": "Get KubernetesResources - ValidatingAdmissionPolicy", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "validatingadmissionpolicy-deny-privileged-containers", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/validatingadmissionpolicy-deny-privileged-containers", + "name": "validatingadmissionpolicy-deny-privileged-containers", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "admissionregistration.k8s.io/v1", + "kind": "ValidatingAdmissionPolicy", + "metadata": { + "name": "deny-privileged-containers", + "uid": "b8c9d0e1-f2a3-4567-bcde-890123456789", + "resourceVersion": "5678901", + "generation": 1, + "creationTimestamp": "2026-03-15T11:00:00Z", + "labels": [ + { + "name": "policy.security.io/category", + "value": "pod-security" + } + ], + "annotations": [ + { + "name": "policy.security.io/severity", + "value": "critical" + } + ] + }, + "spec": { + "admissionPolicyFailurePolicy": "Fail", + "admissionPolicyMatchConstraints": [ + "Group=* Resource=pods Operations=[CREATE UPDATE]", + "Group=apps Resource=deployments Operations=[CREATE UPDATE]", + "Group=apps Resource=statefulsets Operations=[CREATE UPDATE]" + ] + }, + "status": { + "conditions": [ + { + "type": "Ready", + "status": "True", + "reason": "ValidationApplied", + "message": "Policy is active and enforcing.", + "lastTransitionTime": "2026-03-15T11:01:00Z" + } + ] + }, + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ValidatingAdmissionPolicyBinding.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ValidatingAdmissionPolicyBinding.json new file mode 100644 index 000000000000..10b622a6f7aa --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-ValidatingAdmissionPolicyBinding.json @@ -0,0 +1,66 @@ +{ + "title": "Get KubernetesResources - ValidatingAdmissionPolicyBinding", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "validatingadmissionpolicybinding-deny-privileged-binding", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/validatingadmissionpolicybinding-deny-privileged-binding", + "name": "validatingadmissionpolicybinding-deny-privileged-binding", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "admissionregistration.k8s.io/v1", + "kind": "ValidatingAdmissionPolicyBinding", + "metadata": { + "name": "deny-privileged-binding", + "uid": "c9d0e1f2-a3b4-5678-cdef-901234567890", + "resourceVersion": "6789012", + "generation": 1, + "creationTimestamp": "2026-03-15T11:05:00Z", + "labels": [ + { + "name": "policy.security.io/category", + "value": "pod-security" + } + ] + }, + "spec": { + "admissionPolicyBindingPolicyName": "deny-privileged-containers", + "admissionPolicyValidationActions": [ + "Deny", + "Audit" + ] + }, + "status": { + "conditions": [ + { + "type": "Ready", + "status": "True", + "reason": "BindingApplied", + "message": "PolicyBinding is active.", + "lastTransitionTime": "2026-03-15T11:06:00Z" + } + ] + }, + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-VolumeAttachment.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-VolumeAttachment.json new file mode 100644 index 000000000000..f0e5993f0eb5 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources-VolumeAttachment.json @@ -0,0 +1,57 @@ +{ + "title": "Get KubernetesResources - VolumeAttachment", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "volumeattachment-csi-azuredisk-pvc-d0e1f2a3", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/volumeattachment-csi-azuredisk-pvc-d0e1f2a3", + "name": "volumeattachment-csi-azuredisk-pvc-d0e1f2a3", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "storage.k8s.io/v1", + "kind": "VolumeAttachment", + "metadata": { + "name": "csi-azuredisk-pvc-d0e1f2a3-b4c5-6789-defa-901234567890", + "uid": "e1f2a3b4-c5d6-7890-efab-234567890123", + "resourceVersion": "9123456", + "creationTimestamp": "2026-03-01T10:00:10Z", + "labels": [ + { + "name": "app.kubernetes.io/managed-by", + "value": "disk.csi.azure.com" + } + ] + }, + "spec": { + "attacherName": "disk.csi.azure.com", + "attachedVolumeName": "pvc-d0e1f2a3-b4c5-6789-defa-901234567890", + "nodeName": "aks-nodepool1-12345678-0" + }, + "status": { + "volumeAttached": true, + "conditions": [] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources.json new file mode 100644 index 000000000000..e4cbe5f019f7 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/GetKubernetesResources.json @@ -0,0 +1,286 @@ +{ + "title": "Get KubernetesResources", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "pod-nginx-6d4cf56db6-x7q2p-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/pod-nginx-6d4cf56db6-x7q2p-default", + "name": "pod-nginx-6d4cf56db6-x7q2p-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "name": "nginx-6d4cf56db6-x7q2p", + "namespaceName": "default", + "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "resourceVersion": "8834210", + "generation": 1, + "creationTimestamp": "2026-05-01T10:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + }, + { + "name": "pod-template-hash", + "value": "6d4cf56db6" + } + ], + "annotations": [ + { + "name": "kubectl.kubernetes.io/last-applied-configuration", + "value": "{}" + } + ], + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "nginx-6d4cf56db6", + "uid": "c3d4e5f6-a7b8-9012-cdef-012345678901", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "nodeName": "aks-nodepool1-12345678-0", + "restartPolicy": "Always", + "serviceAccountName": "nginx-sa", + "dnsPolicy": "ClusterFirst", + "terminationGracePeriodSeconds": 30, + "priorityClassName": "high-priority", + "nodeSelector": [ + { + "name": "kubernetes.io/os", + "value": "linux" + }, + { + "name": "agentpool", + "value": "nodepool1" + } + ], + "hostNetwork": false, + "hostPid": false, + "hostIpc": false, + "runtimeClassName": "containerd", + "securityContext": { + "runAsUser": 1000, + "runAsGroup": 3000, + "fsGroup": 2000, + "runAsNonRoot": true, + "seccompProfile": "RuntimeDefault" + }, + "tolerations": [ + { + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + }, + { + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "nginx-config", + "sourceType": "configMap", + "source": "nginx-config-map" + }, + { + "name": "tmp-dir", + "sourceType": "emptyDir", + "sizeLimit": "50Mi" + }, + { + "name": "kube-api-access", + "sourceType": "projected" + } + ], + "containers": [ + { + "name": "nginx", + "image": "nginx:1.25.4", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "http", + "containerPort": 80, + "protocol": "TCP" + }, + { + "name": "https", + "containerPort": 443, + "protocol": "TCP" + } + ], + "env": [ + { + "name": "POD_NAMESPACE", + "value": "default" + }, + { + "name": "NGINX_WORKER_PROCESSES", + "value": "2" + } + ], + "envFrom": [ + { + "configMapRef": "nginx-common-config" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + }, + "limits": { + "cpu": "200m", + "memory": "256Mi" + } + }, + "volumeMounts": [ + { + "name": "nginx-config", + "mountPath": "/etc/nginx/conf.d", + "readOnly": true + }, + { + "name": "tmp-dir", + "mountPath": "/tmp" + }, + { + "name": "kube-api-access", + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "readOnly": true + } + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "runAsNonRoot": true, + "runAsUser": 1000, + "privileged": false, + "seccompProfile": "RuntimeDefault", + "capabilities": { + "drop": [ + "ALL" + ] + } + }, + "livenessProbe": { + "type": "HTTPGet", + "path": "/healthz", + "port": 8080 + }, + "readinessProbe": { + "type": "HTTPGet", + "path": "/readyz", + "port": 8080 + } + } + ] + }, + "status": { + "phase": "Running", + "podIp": "10.244.1.42", + "podIps": [ + "10.244.1.42", + "fd00::1:2a" + ], + "hostIp": "10.240.0.4", + "hostIps": [ + "10.240.0.4" + ], + "startTime": "2026-05-01T10:00:05Z", + "qosClass": "Burstable", + "reason": "", + "initContainerStatuses": [], + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastTransitionTime": "2026-05-01T10:00:05Z" + }, + { + "type": "Ready", + "status": "True", + "lastTransitionTime": "2026-05-01T10:00:18Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastTransitionTime": "2026-05-01T10:00:18Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastTransitionTime": "2026-05-01T10:00:05Z" + } + ], + "containerStatuses": [ + { + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "image": "nginx:1.25.4", + "containerId": "containerd://a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2", + "state": { + "running": { + "startedAt": "2026-05-01T10:00:17Z" + } + } + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "Scheduled", + "age": "28d", + "from": "default-scheduler", + "message": "Successfully assigned default/nginx-6d4cf56db6-x7q2p to aks-nodepool1-12345678-0" + }, + { + "type": "Normal", + "reason": "Pulled", + "age": "28d", + "from": "kubelet", + "message": "Container image \"nginx:1.25.4\" already present on machine" + }, + { + "type": "Normal", + "reason": "Started", + "age": "28d", + "from": "kubelet", + "message": "Started container nginx" + } + ] + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/ListKubernetesResources.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/ListKubernetesResources.json new file mode 100644 index 000000000000..fbcc5b17e76d --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/examples/2026-06-15-preview/ListKubernetesResources.json @@ -0,0 +1,308 @@ +{ + "title": "List KubernetesResources", + "operationId": "KubernetesResources_List", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/pod-coredns-5d78c9869d-r4pzt-kube-system", + "name": "pod-coredns-5d78c9869d-r4pzt-kube-system", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "name": "coredns-5d78c9869d-r4pzt", + "namespaceName": "kube-system", + "uid": "d4e5f6a7-b8c9-0123-defa-234567890123", + "resourceVersion": "7712091", + "generation": 1, + "creationTimestamp": "2026-04-01T08:05:00Z", + "labels": [ + { + "name": "k8s-app", + "value": "kube-dns" + }, + { + "name": "pod-template-hash", + "value": "5d78c9869d" + } + ], + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "coredns-5d78c9869d", + "uid": "e5f6a7b8-c9d0-1234-efab-345678901234", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "nodeName": "aks-nodepool1-12345678-1", + "restartPolicy": "Always", + "serviceAccountName": "coredns", + "dnsPolicy": "Default", + "terminationGracePeriodSeconds": 30, + "securityContext": { + "runAsNonRoot": true + }, + "tolerations": [ + { + "key": "CriticalAddonsOnly", + "operator": "Exists" + }, + { + "key": "node-role.kubernetes.io/control-plane", + "operator": "Exists", + "effect": "NoSchedule" + } + ], + "volumes": [ + { + "name": "config-volume", + "sourceType": "configMap", + "source": "coredns" + }, + { + "name": "kube-api-access", + "sourceType": "projected" + } + ], + "containers": [ + { + "name": "coredns", + "image": "registry.k8s.io/coredns/coredns:v1.11.1", + "ports": [ + { + "name": "dns", + "containerPort": 53, + "protocol": "UDP" + }, + { + "name": "dns-tcp", + "containerPort": 53, + "protocol": "TCP" + }, + { + "name": "metrics", + "containerPort": 9153, + "protocol": "TCP" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "70Mi" + }, + "limits": { + "memory": "170Mi" + } + }, + "volumeMounts": [ + { + "name": "config-volume", + "mountPath": "/etc/coredns", + "readOnly": true + }, + { + "name": "kube-api-access", + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "readOnly": true + } + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "capabilities": { + "add": [ + "NET_BIND_SERVICE" + ], + "drop": [ + "ALL" + ] + } + } + } + ] + }, + "status": { + "phase": "Running", + "podIp": "10.244.0.3", + "hostIp": "10.240.0.5", + "startTime": "2026-04-01T08:05:02Z", + "qosClass": "Burstable", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:02Z" + }, + { + "type": "Ready", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:14Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:14Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:02Z" + } + ], + "containerStatuses": [ + { + "name": "coredns", + "ready": true, + "restartCount": 0, + "started": true, + "image": "registry.k8s.io/coredns/coredns:v1.11.1", + "containerId": "containerd://b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3", + "state": { + "running": { + "startedAt": "2026-04-01T08:05:13Z" + } + } + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "Scheduled", + "age": "58d", + "from": "default-scheduler", + "message": "Successfully assigned kube-system/coredns-5d78c9869d-r4pzt to aks-nodepool1-12345678-1" + }, + { + "type": "Normal", + "reason": "Pulled", + "age": "58d", + "from": "kubelet", + "message": "Container image \"registry.k8s.io/coredns/coredns:v1.11.1\" already present on machine" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + }, + { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/deployment-nginx-default", + "name": "deployment-nginx-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "nginx", + "namespaceName": "default", + "uid": "b1c2d3e4-f5a6-7890-bcde-f12345678901", + "resourceVersion": "2234567", + "generation": 3, + "creationTimestamp": "2026-04-15T09:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + } + ] + }, + "spec": { + "replicas": 3, + "selector": [ + { + "name": "app", + "value": "nginx" + } + ], + "strategyType": "RollingUpdate", + "maxUnavailable": "25%", + "maxSurge": "25%", + "containers": [ + { + "name": "nginx", + "image": "nginx:1.25.4", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "http", + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + }, + "limits": { + "cpu": "500m", + "memory": "512Mi" + } + } + } + ] + }, + "status": { + "replicas": 3, + "readyReplicas": 3, + "availableReplicas": 3, + "updatedReplicas": 3, + "unavailableReplicas": 0, + "observedGeneration": 3, + "conditions": [ + { + "type": "Available", + "status": "True", + "reason": "MinimumReplicasAvailable", + "message": "Deployment has minimum availability.", + "lastTransitionTime": "2026-04-15T09:00:20Z" + }, + { + "type": "Progressing", + "status": "True", + "reason": "NewReplicaSetAvailable", + "message": "ReplicaSet has successfully progressed.", + "lastTransitionTime": "2026-04-15T09:00:20Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + ], + "nextLink": null + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/main.tsp b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/main.tsp new file mode 100644 index 000000000000..74a55f0248b3 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/main.tsp @@ -0,0 +1,33 @@ +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; +import "@azure-tools/typespec-azure-resource-manager"; +import "./models.tsp"; +import "./KubernetesResource.tsp"; + +using TypeSpec.Rest; +using TypeSpec.Http; +using Azure.ResourceManager.Foundations; +using Azure.Core; +using Azure.ResourceManager; +using TypeSpec.Versioning; + +/** + * APIs for K8s inventory reports under Microsoft.KubernetesConfiguration. + */ +#suppress "@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint" "KubernetesResources is a proxy resource provider under Microsoft.Kubernetes; no independent operations endpoint is registered." +@armProviderNamespace +@service(#{ title: "KubernetesResourcesClient" }) +@versioned(Versions) +@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v6) +namespace Microsoft.KubernetesConfiguration; + +/** + * The available API versions. + */ +enum Versions { + /** + * The 2026-06-15-preview API version. + */ + v2026_06_15_preview: "2026-06-15-preview", +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/models.tsp b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/models.tsp new file mode 100644 index 000000000000..04ab801e419b --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/models.tsp @@ -0,0 +1,1747 @@ +import "@typespec/rest"; +import "@typespec/http"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-resource-manager"; +import "@azure-tools/typespec-azure-core"; + +using TypeSpec.Rest; +using TypeSpec.Http; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.ResourceManager; +using Azure.ResourceManager.Foundations; + +namespace Microsoft.KubernetesConfiguration; + +/** A single Kubernetes label (key/value pair used for selection and grouping). */ +model KubernetesLabel { + /** Label key (e.g., 'app.kubernetes.io/name'). */ + @key + @visibility(Lifecycle.Read) + name: string; + + /** Label value. */ + value?: string; +} + +/** A single Kubernetes annotation (key/value pair for non-identifying auxiliary metadata). */ +model KubernetesAnnotation { + /** Annotation key (e.g., 'kubectl.kubernetes.io/last-applied-configuration'). */ + @key + @visibility(Lifecycle.Read) + name: string; + + /** Annotation value. */ + value?: string; +} + +// ─── Common Kubernetes types ────────────────────────────────────────────────── + +/** A reference from a Kubernetes object to its owner (e.g., a ReplicaSet owning a Pod). */ +model OwnerReference { + /** API version of the owner (e.g., 'apps/v1'). */ + apiVersion?: string; + + /** Kind of the owner (e.g., 'ReplicaSet'). */ + kind?: string; + + /** Name of the owner object. */ + name?: string; + + /** UID of the owner object. */ + @key + @visibility(Lifecycle.Read) + uid: string; + + /** True when this owner manages the lifecycle of the referencing object. */ + controller?: boolean; + + /** If true, deletion of the owner is blocked until this reference is removed. */ + blockOwnerDeletion?: boolean; +} + +/** Metadata common to all Kubernetes objects (subset of ObjectMeta). */ +model KubernetesObjectMeta { + /** Name of the Kubernetes object, unique within its namespace. */ + name: string; + + /** + * Namespace the object belongs to. + * Empty for cluster-scoped resources such as Node and Namespace. + */ + namespaceName?: string; + + /** Immutable UID assigned by the Kubernetes API server. */ + uid?: string; + + /** + * Opaque version string used for optimistic concurrency. + * Clients must treat this as opaque and pass it unmodified on updates. + */ + resourceVersion?: string; + + /** Sequence number incremented each time the object spec changes. */ + generation?: int64; + + /** UTC timestamp when the object was created. */ + creationTimestamp?: utcDateTime; + + /** + * UTC timestamp set when a graceful deletion has been requested. + * Absent when the object is not being deleted. + */ + deletionTimestamp?: utcDateTime; + + /** User-defined key/value pairs used for selection and grouping. */ + @identifiers(#["name"]) + labels?: KubernetesLabel[]; + + /** Key/value pairs for non-identifying auxiliary metadata. */ + @identifiers(#["name"]) + annotations?: KubernetesAnnotation[]; + + /** References to the objects that own this object (e.g., the ReplicaSet that owns a Pod). */ + @identifiers(#["uid"]) + ownerReferences?: OwnerReference[]; + + /** Named lifecycle hooks that must be resolved before the object is deleted. */ + finalizers?: string[]; +} + +/** Whether a Kubernetes condition is currently active. */ +union ConditionStatus { + string, + + /** Condition is currently true. */ + True: "True", + + /** Condition is currently false. */ + False: "False", + + /** Condition state cannot be determined. */ + Unknown: "Unknown", +} + +/** A Kubernetes-style status condition reported by a controller. */ +model KubernetesCondition { + /** Type of the condition (e.g., 'Ready', 'Available', 'Progressing'). */ + type: string; + + /** Whether the condition is currently active. */ + status?: ConditionStatus; + + /** Machine-readable reason code for the current status. */ + reason?: string; + + /** Human-readable explanation of the current status. */ + message?: string; + + /** UTC timestamp of the last status transition. */ + lastTransitionTime?: utcDateTime; +} + +// ─── Generic overflow field ─────────────────────────────────────────────────── + +/** + * A generic recursive field node used to represent resource-specific fields + * that are not captured by the typed properties on KubernetesResourceSpec + * or KubernetesResourceStatus (e.g., uncommon fields and CRD-specific data). + */ +model KubernetesGenericField { + /** Field name. */ + @key + @visibility(Lifecycle.Read) + name: string; + + /** The string value of the field. */ + value?: string; +} + +// ─── Container support models ───────────────────────────────────────────────── + +/** A volume mount inside a container. */ +model VolumeMount { + /** Name matching a volume declared in the pod spec. */ + name: string; + + /** Absolute path inside the container where the volume is mounted. */ + mountPath?: string; + + /** Mount the volume as read-only when true. */ + readOnly?: boolean; + + /** Sub-path within the volume to mount instead of the volume root. */ + subPath?: string; +} + +/** Linux capability set to add to or drop from a container's default capabilities. */ +model Capabilities { + /** Capabilities to add (e.g., 'NET_ADMIN'). */ + add?: string[]; + + /** Capabilities to remove (e.g., 'ALL'). */ + drop?: string[]; +} + +/** Security context applied to a single container. */ +model ContainerSecurityContext { + /** Linux capability adjustments for this container. */ + capabilities?: Capabilities; + + /** When true, the container runs with full host privileges (root + all Linux capabilities). */ + privileged?: boolean; + + /** Mount the container's root filesystem as read-only when true. */ + readOnlyRootFilesystem?: boolean; + + /** Prevent the container process from gaining more privileges than its parent when false. */ + allowPrivilegeEscalation?: boolean; + + /** Require the container to run as a non-root user when true. */ + runAsNonRoot?: boolean; + + /** UID to run the container process as. */ + runAsUser?: int64; + + /** GID to run the container process as. */ + runAsGroup?: int64; + + /** Seccomp profile type applied to this container ('RuntimeDefault', 'Unconfined', or 'Localhost'). */ + seccompProfile?: string; +} + +/** Network protocol used by a container port. */ +union NetworkProtocol { + string, + + /** Transmission Control Protocol. */ + TCP: "TCP", + + /** User Datagram Protocol. */ + UDP: "UDP", + + /** Stream Control Transmission Protocol. */ + SCTP: "SCTP", +} + +/** A port exposed by a container. */ +model ContainerPortInfo { + /** Port number exposed inside the container. */ + containerPort: int32; + + /** Network protocol for this port. */ + protocol?: NetworkProtocol; + + /** Optional name for this port. */ + name?: string; + + /** Port number to expose on the host node. */ + hostPort?: int32; + + /** Host IP to bind the hostPort on. */ + hostIp?: string; +} + +/** An environment variable set in a container. */ +model EnvVar { + /** Name of the environment variable. */ + name: string; + + /** Literal string value. */ + value?: string; +} + +/** A source for bulk-importing environment variables into a container from a ConfigMap or Secret. */ +model EnvFromSource { + /** Name of the ConfigMap whose keys are imported as environment variables. */ + configMapRef?: string; + + /** Name of the Secret whose keys are imported as environment variables. */ + #suppress "@azure-tools/typespec-azure-resource-manager/secret-prop" "secretRef holds the name of a Kubernetes Secret object, not a secret value" + secretRef?: string; + + /** Optional prefix prepended to each imported environment variable name. */ + prefix?: string; +} + +/** + * CPU and memory resource quantities for a container. + * Values use Kubernetes resource notation: CPU as millicores (e.g., '500m', '2') + * and memory as byte-unit strings (e.g., '256Mi', '1Gi'). + * See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + */ +model ContainerResourceQuantity { + /** CPU quantity (e.g., '500m' for 500 millicores, '2' for 2 cores). */ + cpu?: string; + + /** Memory quantity (e.g., '256Mi', '1Gi'). */ + memory?: string; +} + +/** CPU and memory resource declarations for a container. */ +model ContainerResourceRequirements { + /** Maximum resources the container may consume. */ + limits?: ContainerResourceQuantity; + + /** Minimum resources the container requires to be scheduled. */ + requests?: ContainerResourceQuantity; +} + +/** + * Simplified health probe configuration for a container. + * Captures the probe mechanism type and the primary target (path or port). + * Detailed timing parameters (initialDelaySeconds, periodSeconds, etc.) can be stored in additionalFields. + */ +model ContainerProbe { + /** Probe mechanism: 'HTTPGet', 'TCPSocket', 'Exec', or 'GRPC'. */ + type?: string; + + /** URL path for HTTPGet probes (e.g., '/healthz', '/readyz'). */ + path?: string; + + /** Port number for HTTPGet or TCPSocket probes. */ + port?: int32; +} + +/** Specification of a single container within a pod. */ +model ContainerSpec { + /** Name of the container, unique within the pod. */ + name: string; + + /** Container image reference (e.g., 'nginx:1.25'). */ + image?: string; + + /** Image pull policy for this container ('Always', 'IfNotPresent', or 'Never'). */ + imagePullPolicy?: string; + + /** Ports to expose from the container. */ + @identifiers(#["name"]) + ports?: ContainerPortInfo[]; + + /** Environment variables to set in the container. */ + @identifiers(#["name"]) + env?: EnvVar[]; + + /** Sources that populate environment variables in bulk from ConfigMaps or Secrets. */ + @identifiers(#[]) + envFrom?: EnvFromSource[]; + + /** Compute resource requests and limits. */ + resources?: ContainerResourceRequirements; + + /** Command to override the container default ENTRYPOINT. */ + command?: string[]; + + /** Arguments to override the container default CMD. */ + args?: string[]; + + /** Volume paths to mount inside the container. */ + @identifiers(#["name"]) + volumeMounts?: VolumeMount[]; + + /** Security context applied to this container. */ + securityContext?: ContainerSecurityContext; + + /** Liveness probe that determines when to restart the container. */ + livenessProbe?: ContainerProbe; + + /** Readiness probe that determines when the container is ready to accept traffic. */ + readinessProbe?: ContainerProbe; +} + +// ─── Pod-level support models ───────────────────────────────────────────────── + +/** + * A volume available to containers in a pod. + * The sourceType field identifies the kind of volume source + * (e.g., 'emptyDir', 'configMap', 'secret', 'persistentVolumeClaim', 'projected'). + */ +model Volume { + /** Name of the volume, referenced by container volumeMounts. */ + name: string; + + /** + * Kind of volume source + * (e.g., 'emptyDir', 'configMap', 'secret', 'persistentVolumeClaim', 'projected'). + */ + sourceType?: string; + + /** Primary reference for the volume source (e.g., ConfigMap name or PVC name). */ + source?: string; + + /** Storage size limit for emptyDir volumes (e.g., '50Mi'). */ + sizeLimit?: string; +} + +/** A toleration allows a pod to be scheduled on a node with a matching taint. */ +model Toleration { + /** Taint key the toleration applies to. Empty matches all keys. */ + #suppress "@azure-tools/typespec-azure-resource-manager/secret-prop" "Toleration key is a Kubernetes taint key identifier, not a secret" + @key + @visibility(Lifecycle.Read) + key: string; + + /** + * Operator to use when matching: 'Equal' matches when key and value both match; + * 'Exists' matches when the key is present regardless of value. + */ + operator?: string; + + /** Taint value matched when operator is 'Equal'. */ + value?: string; + + /** + * Taint effect this toleration applies to + * ('NoSchedule', 'PreferNoSchedule', or 'NoExecute'). Empty matches all effects. + */ + effect?: string; + + /** Seconds a pod tolerates a NoExecute taint before being evicted. */ + tolerationSeconds?: int64; +} + +/** Security context applied at the pod level, affecting all containers. */ +model PodSecurityContext { + /** GID of the owning group for volume mounts; processes also run as this GID. */ + fsGroup?: int64; + + /** UID to run all containers as. Overridden per-container by ContainerSecurityContext.runAsUser. */ + runAsUser?: int64; + + /** GID to run all containers as. */ + runAsGroup?: int64; + + /** Require all containers to run as non-root when true. */ + runAsNonRoot?: boolean; + + /** Supplemental GIDs applied to each container in addition to the primary GID. */ + supplementalGroups?: int64[]; + + /** Seccomp profile type applied to all containers ('RuntimeDefault', 'Unconfined', or 'Localhost'). */ + seccompProfile?: string; + + /** AppArmor profile type applied to all containers ('RuntimeDefault', 'Unconfined', or 'Localhost'). */ + appArmorProfile?: string; +} + +/** State of a currently running container. */ +model ContainerStateRunning { + /** UTC timestamp when the container started. */ + startedAt?: utcDateTime; +} + +/** State of a terminated container. */ +model ContainerStateTerminated { + /** Exit code of the container process. */ + exitCode: int32; + + /** Signal that caused the container to terminate, if applicable. */ + signal?: int32; + + /** Machine-readable reason for termination (e.g., 'OOMKilled', 'Completed'). */ + reason?: string; + + /** Human-readable message about the termination. */ + message?: string; + + /** UTC timestamp when the container started its last execution. */ + startedAt?: utcDateTime; + + /** UTC timestamp when the container terminated. */ + finishedAt?: utcDateTime; +} + +/** State of a container that is not yet running. */ +model ContainerStateWaiting { + /** Machine-readable reason the container is not running (e.g., 'ContainerCreating', 'ImagePullBackOff'). */ + reason?: string; + + /** Human-readable message about the waiting state. */ + message?: string; +} + +/** Current or previous state of a container; exactly one of the three fields is populated. */ +model ContainerState { + /** Populated when the container is currently executing. */ + running?: ContainerStateRunning; + + /** Populated when the container has exited. */ + terminated?: ContainerStateTerminated; + + /** Populated when the container is not yet running. */ + waiting?: ContainerStateWaiting; +} + +/** Runtime status of a single container as reported in the pod status. */ +model ContainerStatus { + /** Name of the container. */ + name: string; + + /** True when the container has passed its readiness probe. */ + ready?: boolean; + + /** Number of times the container has restarted since the pod was started. */ + restartCount?: int32; + + /** Container image including digest as resolved by the runtime. */ + image?: string; + + /** Whether the container has passed its startup probe and is considered started. */ + started?: boolean; + + /** Current state of the container. */ + state?: ContainerState; + + /** Previous termination state of the container; populated after a restart. */ + lastState?: ContainerState; + + /** Opaque container runtime identifier (e.g., 'containerd://sha256:...'). */ + containerId?: string; +} + +// ─── Service models ─────────────────────────────────────────────────────────── + +/** A port exposed by a Kubernetes Service. */ +model ServicePort { + /** Port number the Service listens on (cluster-internal). */ + port: int32; + + /** Port or named port on the target pod the traffic is forwarded to. */ + targetPort?: string; + + /** NodePort allocated for NodePort and LoadBalancer Services. */ + nodePort?: int32; + + /** Network protocol for this port. */ + protocol?: NetworkProtocol; + + /** Optional name for this port, unique within the Service. */ + name?: string; + + /** Application-level protocol hint (e.g., 'http', 'https', 'grpc'). */ + appProtocol?: string; +} + +// ─── Node models ───────────────────────────────────────────────────────────── + +/** Effect applied to pods that do not tolerate a node taint. */ +union NodeTaintEffect { + string, + + /** New pods will not be scheduled on the tainted node. */ + NoSchedule: "NoSchedule", + + /** The scheduler tries to avoid placing new pods on the tainted node. */ + PreferNoSchedule: "PreferNoSchedule", + + /** Existing pods without a matching toleration are evicted from the tainted node. */ + NoExecute: "NoExecute", +} + +/** A taint applied to a Kubernetes Node that repels pods without a matching toleration. */ +model NodeTaint { + /** Taint key (e.g., 'node.kubernetes.io/not-ready'). */ + #suppress "@azure-tools/typespec-azure-resource-manager/secret-prop" "Taint key is a Kubernetes taint key identifier, not a secret" + key: string; + + /** Taint value matched by tolerations using the 'Equal' operator. */ + value?: string; + + /** Effect applied to non-tolerating pods. */ + effect?: NodeTaintEffect; +} + +/** A network address associated with a Kubernetes Node. */ +model NodeAddress { + /** Address type (e.g., 'InternalIP', 'ExternalIP', 'Hostname'). */ + type?: string; + + /** The address value (IP address or hostname). */ + address: string; +} + +/** Operating system and runtime information reported by the kubelet for a Node. */ +model NodeSystemInfo { + /** Kernel version of the node OS (e.g., '5.15.0-1041-azure'). */ + kernelVersion?: string; + + /** Human-readable OS image string (e.g., 'Ubuntu 22.04.3 LTS'). */ + osImage?: string; + + /** Container runtime name and version (e.g., 'containerd://1.7.2'). */ + containerRuntimeVersion?: string; + + /** Kubelet binary version running on the node (e.g., 'v1.29.2'). */ + kubeletVersion?: string; + + /** kube-proxy version running on the node. */ + kubeProxyVersion?: string; + + /** CPU architecture of the node (e.g., 'amd64', 'arm64'). */ + architecture?: string; + + /** Operating system family ('linux' or 'windows'). */ + operatingSystem?: string; +} + +/** Resource quantities reported for a Kubernetes Node (capacity or allocatable). */ +model NodeResourceMap { + /** CPU quantity (e.g., '4', '3850m'). */ + cpu?: string; + + /** Memory quantity (e.g., '16Gi', '14902Mi'). */ + memory?: string; + + /** Maximum number of pods the node supports. */ + pods?: string; + + /** Ephemeral storage quantity (e.g., '119Gi'). */ + ephemeralStorage?: string; +} + +/** A volume attached to a Kubernetes Node by the attach/detach controller. */ +model AttachedVolume { + /** Name of the attached volume (matches the PersistentVolume name). */ + name: string; + + /** Device path on the node where the volume is attached (e.g., '/dev/sdc'). */ + devicePath?: string; +} + +// ─── StatefulSet models ─────────────────────────────────────────────────────── + +/** A PersistentVolumeClaim template in a StatefulSet that provisions stable storage per replica. */ +model VolumeClaimTemplate { + /** Name of the volume claim template, referenced by container volumeMounts. */ + name: string; + + /** Requested storage access modes (e.g., 'ReadWriteOnce'). */ + accessModes?: string[]; + + /** StorageClass used for dynamic provisioning. */ + storageClassName?: string; + + /** Storage quantity requested per replica (e.g., '10Gi'). */ + storageRequest?: string; + + /** Volume mode ('Filesystem' or 'Block'). */ + volumeMode?: string; +} + +// ─── EndpointSlice models ───────────────────────────────────────────────────── + +/** A single endpoint within an EndpointSlice (address + readiness + scheduling hints). */ +model EndpointSliceEndpoint { + /** IP addresses (IPv4/IPv6) or FQDNs serving this endpoint. */ + addresses: string[]; + + /** True when the endpoint is ready to receive traffic. */ + ready?: boolean; + + /** Name of the node hosting this endpoint. */ + nodeName?: string; + + /** Kind of the backing object (typically 'Pod'). */ + targetRefKind?: string; + + /** Name of the backing object. */ + targetRefName?: string; + + /** Namespace of the backing object. */ + targetRefNamespace?: string; +} + +/** A port entry in an EndpointSlice. */ +model EndpointSlicePort { + /** Port number. */ + port: int32; + + /** Network protocol ('TCP', 'UDP', or 'SCTP'). */ + protocol?: NetworkProtocol; + + /** Optional name for this port. */ + name?: string; +} + +// ─── RBAC models ───────────────────────────────────────────────────────────── + +/** A single RBAC permission rule granting verbs on Kubernetes API resources. */ +model PolicyRule { + /** API groups the rule applies to (use '' for the core group). */ + apiGroups?: string[]; + + /** Resource types the rule applies to (e.g., 'pods', 'deployments', 'secrets'). */ + resources?: string[]; + + /** Actions permitted (e.g., 'get', 'list', 'watch', 'create', 'update', 'patch', 'delete'). */ + verbs: string[]; + + /** Specific resource names this rule applies to. Empty means all instances. */ + resourceNames?: string[]; +} + +/** A subject (user, group, or service account) in a RoleBinding or ClusterRoleBinding. */ +model RbacSubject { + /** Kind of the subject: 'User', 'Group', or 'ServiceAccount'. */ + kind?: string; + + /** Name of the subject. */ + name: string; + + /** Namespace of the ServiceAccount. Required when kind is ServiceAccount. */ + namespaceName?: string; +} + +// ─── Ingress models ─────────────────────────────────────────────────────────── + +/** An HTTP path rule within an Ingress host entry, mapping a URL path to a backend Service. */ +model IngressPath { + /** URL path to match (e.g., '/api', '/'). */ + path?: string; + + /** Path matching semantics ('Exact', 'Prefix', or 'ImplementationSpecific'). */ + pathType?: string; + + /** Name of the backend Service receiving matched traffic. */ + serviceName: string; + + /** Port of the backend Service (numeric string or named port). */ + servicePort?: string; +} + +/** A host-level routing rule in an Ingress resource. */ +model IngressRule { + /** Fully qualified domain name or wildcard host (e.g., 'api.example.com', '*.example.com'). */ + host?: string; + + /** HTTP path rules mapping URL paths to backend Services. */ + @identifiers(#[]) + paths?: IngressPath[]; +} + +/** TLS configuration entry for an Ingress resource. */ +model IngressTls { + /** Hostnames covered by this TLS certificate. */ + hosts?: string[]; + + /** Name of the Secret containing the TLS certificate and private key. */ + secretName?: string; +} + +// ─── Generic flat spec and status ──────────────────────────────────────────── + +/** + * Desired state (spec) of a Kubernetes resource. + * + * Well-known fields for native workloads (Pod, Deployment, Service, etc.) are typed + * directly. Fields not covered by any typed property can be placed in additionalFields. + */ +model KubernetesResourceSpec { + // ── Pod / workload ────────────────────────────────────────────────────────── + + /** Name of the node the pod is scheduled on. Populated for Pod resources. */ + nodeName?: string; + + /** Pod restart policy (e.g., 'Always', 'OnFailure', 'Never'). Populated for Pod resources. */ + restartPolicy?: string; + + /** + * Containers belonging to the pod or pod template. + * Populated for Pod, Deployment, StatefulSet, and DaemonSet resources. + */ + @identifiers(#["name"]) + containers?: ContainerSpec[]; + + /** + * Init containers that run before app containers start. + * Populated for Pod, Deployment, StatefulSet, and DaemonSet resources. + */ + @identifiers(#["name"]) + initContainers?: ContainerSpec[]; + + /** Grace period in seconds before forcibly terminating the pod on deletion. */ + terminationGracePeriodSeconds?: int64; + + /** + * Node label selector constraining which nodes this pod may be scheduled on. + * Populated for Pod, Deployment, StatefulSet, and DaemonSet resources. + */ + @identifiers(#["name"]) + nodeSelector?: KubernetesLabel[]; + + /** + * Name of the PriorityClass governing scheduling priority and preemption for this pod. + * Populated for Pod, Deployment, StatefulSet, and DaemonSet resources. + */ + priorityClassName?: string; + + /** + * When true, the pod uses the host network namespace (disables pod network isolation). + * Populated for Pod resources. + */ + hostNetwork?: boolean; + + /** When true, the pod shares the host PID namespace. Populated for Pod resources. */ + hostPid?: boolean; + + /** When true, the pod shares the host IPC namespace. Populated for Pod resources. */ + hostIpc?: boolean; + + /** + * Name of the RuntimeClass for sandbox or specialized container runtimes + * (e.g., 'gvisor', 'kata-containers'). Populated for Pod resources. + */ + runtimeClassName?: string; + + /** + * Names of Secrets used to authenticate image pulls from private registries. + * Populated for Pod, Deployment, StatefulSet, and DaemonSet resources. + */ + imagePullSecrets?: string[]; + + /** + * Operating system of the containers ('linux' or 'windows'). + * Populated for Pod resources. + */ + podOs?: string; + + // ── Deployment / StatefulSet / DaemonSet ──────────────────────────────────── + + /** Desired number of pod replicas. Populated for Deployment and StatefulSet resources. */ + replicas?: int32; + + /** + * Headless service name governing StatefulSet pod network identity. + * Populated for StatefulSet resources. + */ + serviceName?: string; + + /** + * Label selector identifying which pods are managed by this workload. + * Populated for Deployment, StatefulSet, DaemonSet, and ReplicaSet resources. + */ + @identifiers(#["name"]) + selector?: KubernetesLabel[]; + + /** + * Rollout strategy type. + * 'RollingUpdate' or 'Recreate' for Deployment; + * 'RollingUpdate' or 'OnDelete' for StatefulSet and DaemonSet. + */ + strategyType?: string; + + /** + * Maximum number of pods that can be unavailable during a rolling update + * (absolute number or percentage string, e.g., '25%'). + * Populated for Deployment and DaemonSet resources. + */ + maxUnavailable?: string; + + /** + * Maximum number of pods that can be created above the desired count during a rolling update + * (absolute number or percentage string, e.g., '25%'). + * Populated for Deployment resources. + */ + maxSurge?: string; + + /** When true, the Deployment rollout is paused. Populated for Deployment resources. */ + paused?: boolean; + + /** + * Pod creation and deletion ordering policy for a StatefulSet + * ('OrderedReady' for sequential or 'Parallel' for simultaneous). + * Populated for StatefulSet resources. + */ + podManagementPolicy?: string; + + /** + * PVC templates stamped out per StatefulSet replica to provide stable per-pod storage. + * Populated for StatefulSet resources. + */ + @identifiers(#["name"]) + volumeClaimTemplates?: VolumeClaimTemplate[]; + + /** + * Maximum number of pods that can be unavailable during a StatefulSet rolling update + * (absolute number or percentage string, e.g., '1', '25%'). Beta as of Kubernetes 1.24. + * Populated for StatefulSet resources. + */ + maxUnavailableReplicas?: string; + + // ── Service ───────────────────────────────────────────────────────────────── + + /** + * How the service is exposed (e.g., 'ClusterIP', 'NodePort', 'LoadBalancer'). + * Populated for Service resources. + */ + serviceType?: string; + + /** Cluster-internal IP assigned to the service. Populated for Service resources. */ + clusterIp?: string; + + /** Ports exposed by the Service. Populated for Service resources. */ + @identifiers(#["name"]) + servicePorts?: ServicePort[]; + + /** + * Label selector routing traffic to pods backing this Service. + * Populated for Service resources. + */ + @identifiers(#["name"]) + serviceSelector?: KubernetesLabel[]; + + /** External IP addresses accepted by cluster nodes for this Service. Populated for Service resources. */ + externalIps?: string[]; + + /** DNS CNAME alias target for ExternalName Services. Populated for Service resources. */ + externalName?: string; + + /** + * Traffic routing policy for externally-facing addresses ('Cluster' or 'Local'). + * Populated for Service resources. + */ + externalTrafficPolicy?: string; + + /** Load balancer implementation class identifier. Populated for LoadBalancer Service resources. */ + loadBalancerClass?: string; + + /** + * Static IP address requested from the cloud provider for a LoadBalancer Service. + * Deprecated in Kubernetes 1.24 in favor of spec.loadBalancerIP on the Service. + * Populated for LoadBalancer Service resources. + */ + loadBalancerIp?: string; + + // ── Pod security and scheduling ───────────────────────────────────────────── + + /** + * Name of the ServiceAccount the pod runs as. + * Populated for Pod, Deployment, StatefulSet, and DaemonSet resources. + */ + serviceAccountName?: string; + + /** + * Tolerations allowing the pod to be scheduled on nodes with matching taints. + * Populated for Pod, Deployment, StatefulSet, and DaemonSet resources. + */ + @identifiers(#[]) + tolerations?: Toleration[]; + + /** + * Volumes available to containers in the pod or pod template. + * Populated for Pod, Deployment, StatefulSet, and DaemonSet resources. + */ + @identifiers(#["name"]) + volumes?: Volume[]; + + /** + * DNS policy for the pod (e.g., 'ClusterFirst', 'Default', 'None'). + * Populated for Pod resources. + */ + dnsPolicy?: string; + + /** + * Security context applied at the pod level. + * Populated for Pod, Deployment, StatefulSet, and DaemonSet resources. + */ + securityContext?: PodSecurityContext; + + // ── Job / CronJob ───────────────────────────────────────────────────────────── + + /** + * Total successful pod completions required for the Job to succeed. + * Populated for Job resources. + */ + completions?: int32; + + /** + * Maximum number of pods running concurrently for a Job. + * Populated for Job resources. + */ + parallelism?: int32; + + /** + * Number of retries before marking the Job as failed. + * Populated for Job resources. + */ + backoffLimit?: int32; + + /** + * Cron schedule expression. + * Populated for CronJob resources. + */ + schedule?: string; + + /** + * Concurrency policy for simultaneous CronJob runs ('Allow', 'Forbid', or 'Replace'). + * Populated for CronJob resources. + */ + concurrencyPolicy?: string; + + /** + * When true, future executions are suspended. + * Populated for CronJob and Job resources. + */ + suspend?: boolean; + + /** + * Maximum duration in seconds before the Job is terminated regardless of its success. + * Populated for Job resources. + */ + activeDeadlineSeconds?: int32; + + /** + * Completion tracking mode for Job pods: 'NonIndexed' (default) or 'Indexed'. + * Populated for Job resources. + */ + completionMode?: string; + + /** + * Seconds after Job completion before the Job and its pods are deleted automatically. + * Populated for Job resources. + */ + ttlSecondsAfterFinished?: int32; + + /** + * IANA time zone name for CronJob scheduling (e.g., 'America/New_York', 'UTC'). + * Populated for CronJob resources. + */ + timeZone?: string; + + /** + * Deadline in seconds for a CronJob run to start if missed; missed runs are ignored beyond this window. + * Populated for CronJob resources. + */ + startingDeadlineSeconds?: int32; + + // ── Storage (PVC / PV / StorageClass) ───────────────────────────────────────── + + /** + * Storage access modes requested or granted + * (e.g., 'ReadWriteOnce', 'ReadOnlyMany', 'ReadWriteMany'). + * Populated for PersistentVolumeClaim and PersistentVolume resources. + */ + accessModes?: string[]; + + /** + * Name of the StorageClass for dynamic provisioning or PVC-to-PV binding. + * Populated for PVC, PV, and StorageClass resources. + */ + storageClassName?: string; + + /** + * Storage quantity requested by a PVC (e.g., '10Gi'). + * Populated for PersistentVolumeClaim resources. + */ + storageRequest?: string; + + /** + * Total storage capacity of a PV (e.g., '100Gi'). + * Populated for PersistentVolume resources. + */ + storageCapacity?: string; + + /** + * Reclaim policy for a PV after its claim is released ('Retain', 'Delete', or 'Recycle'). + * Populated for PersistentVolume and StorageClass resources. + */ + reclaimPolicy?: string; + + /** + * Volume mode describing how the volume is used ('Filesystem' or 'Block'). + * Populated for PVC and PV resources. + */ + volumeMode?: string; + + /** + * For a PVC: the name of the PV it is bound to. + * For a PV: the name of the PVC bound to it. + */ + boundVolumeName?: string; + + /** + * Namespace of the PVC bound to a PV (populated in PV claimRef). + * Populated for PersistentVolume resources. + */ + claimRefNamespace?: string; + + /** + * CSI driver name managing this PersistentVolume (e.g., 'disk.csi.azure.com'). + * Populated for PersistentVolume resources backed by a CSI driver. + */ + csiDriver?: string; + + /** + * Unique volume handle assigned by the CSI driver. + * Populated for PersistentVolume resources backed by a CSI driver. + */ + csiVolumeHandle?: string; + + /** + * CSI driver (provisioner) name for a StorageClass (e.g., 'disk.csi.azure.com'). + * Populated for StorageClass resources. + */ + provisioner?: string; + + /** + * When to bind a PV to a PVC: 'Immediate' binds on creation; + * 'WaitForFirstConsumer' delays until a pod claims the PVC. + * Populated for StorageClass resources. + */ + volumeBindingMode?: string; + + /** + * When true, PVCs using this StorageClass may be expanded after provisioning. + * Populated for StorageClass resources. + */ + allowVolumeExpansion?: boolean; + + /** + * Kubernetes Secret type (e.g., 'Opaque', 'kubernetes.io/tls', 'kubernetes.io/service-account-token'). + * Populated for Secret resources. + */ + secretType?: string; + + // ── ConfigMap ────────────────────────────────────────────────────────────── + + /** + * Key-value pairs stored in the ConfigMap (e.g., configuration files, environment values). + * Each entry maps a string key to a string value. + * Populated for ConfigMap resources. + */ + @identifiers(#["name"]) + configMapData?: KubernetesLabel[]; + + /** + * Keys present in the ConfigMap binaryData field. + * Binary values are not captured; only key names are stored for reference. + * Populated for ConfigMap resources. + */ + configMapBinaryDataKeys?: string[]; + + /** + * When true, the ConfigMap is immutable and cannot be updated after creation. + * Populated for ConfigMap resources. + */ + configMapImmutable?: boolean; + + // ── ServiceAccount ───────────────────────────────────────────────────────── + + /** + * When false, prevents the default Kubernetes service account token from being + * auto-mounted into pods running as this ServiceAccount. + * Populated for ServiceAccount resources. + */ + automountServiceAccountToken?: boolean; + + // ── VolumeAttachment ──────────────────────────────────────────────────────── + + /** + * Name of the CSI driver that should attach/detach the volume (e.g., 'disk.csi.azure.com'). + * Populated for VolumeAttachment resources. + */ + attacherName?: string; + + /** + * Name of the PersistentVolume being attached. + * Populated for VolumeAttachment resources. + */ + attachedVolumeName?: string; + + // ── Ingress / NetworkPolicy ─────────────────────────────────────────────────── + + /** + * Name of the IngressClass that governs this Ingress resource. + * Populated for Ingress resources. + */ + ingressClassName?: string; + + /** + * Routing rules mapping hostnames and URL paths to backend Services. + * Populated for Ingress resources. + */ + @identifiers(#[]) + ingressRules?: IngressRule[]; + + /** + * TLS termination configuration for Ingress resources. + * Populated for Ingress resources. + */ + @identifiers(#[]) + ingressTls?: IngressTls[]; + + /** + * Backend Service name to route traffic when no rule matches. + * Populated for Ingress resources. + */ + defaultBackendServiceName?: string; + + /** + * Backend Service port to route traffic when no rule matches (number or named port). + * Populated for Ingress resources. + */ + defaultBackendServicePort?: string; + + /** + * Controller class reference for an IngressClass (e.g., 'nginx.ingress.kubernetes.io/controller'). + * Populated for IngressClass resources. + */ + ingressController?: string; + + /** + * Label selector identifying the pods this NetworkPolicy applies to. + * Populated for NetworkPolicy resources. + */ + @identifiers(#["name"]) + podSelectorLabels?: KubernetesLabel[]; + + /** + * Policy directions enforced ('Ingress', 'Egress', or both). + * Populated for NetworkPolicy resources. + */ + networkPolicyTypes?: string[]; + + // ── RBAC (Role / RoleBinding / ClusterRole / ClusterRoleBinding) ────────────── + + /** + * RBAC permission rules granting access to Kubernetes API resources. + * Populated for Role and ClusterRole resources. + */ + @identifiers(#[]) + rbacRules?: PolicyRule[]; + + /** + * Subjects (users, groups, service accounts) granted permissions by this binding. + * Populated for RoleBinding and ClusterRoleBinding resources. + */ + @identifiers(#[]) + rbacSubjects?: RbacSubject[]; + + /** + * Kind of the role referenced by a binding ('Role' or 'ClusterRole'). + * Populated for RoleBinding and ClusterRoleBinding resources. + */ + rbacRoleRefKind?: string; + + /** + * Name of the role referenced by a binding. + * Populated for RoleBinding and ClusterRoleBinding resources. + */ + rbacRoleRefName?: string; + + // ── HPA / PDB / PriorityClass ──────────────────────────────────────────────── + + /** + * Kind of the resource being autoscaled (e.g., 'Deployment', 'StatefulSet'). + * Populated for HorizontalPodAutoscaler resources. + */ + scaleTargetRefKind?: string; + + /** + * Name of the resource being autoscaled. + * Populated for HorizontalPodAutoscaler resources. + */ + scaleTargetRefName?: string; + + /** + * Minimum replica count for autoscaling. + * Populated for HorizontalPodAutoscaler resources. + */ + minReplicas?: int32; + + /** + * Maximum replica count for autoscaling. + * Populated for HorizontalPodAutoscaler resources. + */ + maxReplicas?: int32; + + /** + * Minimum number of pods that must remain available during voluntary disruptions + * (absolute number or percentage string, e.g., '2', '50%'). + * Populated for PodDisruptionBudget resources. + */ + minAvailable?: string; + + /** + * Maximum number of pods that may be simultaneously unavailable during voluntary disruptions. + * Populated for PodDisruptionBudget resources. + */ + maxUnavailablePods?: string; + + /** + * Numeric scheduling priority value for a PriorityClass. + * Populated for PriorityClass resources. + */ + priorityValue?: int32; + + /** + * When true, this PriorityClass is the cluster default for pods without an explicit priorityClassName. + * Populated for PriorityClass resources. + */ + globalDefault?: boolean; + + /** + * Preemption policy for pods with this priority class when system resources are scarce + * ('PreemptLowerPriority' or 'Never'). + * Populated for PriorityClass resources. + */ + preemptionPolicy?: string; + + // ── Node ────────────────────────────────────────────────────────────────────── + + /** + * Taints applied to the node, repelling pods that lack a matching toleration. + * Populated for Node resources. + */ + @identifiers(#[]) + taints?: NodeTaint[]; + + /** + * When true, the node is cordoned and will not accept new pod scheduling. + * Populated for Node resources. + */ + unschedulable?: boolean; + + /** + * Cloud provider identifier for the node + * (e.g., 'azure:///subscriptions/.../virtualMachines/vm-0'). + * Populated for Node resources. + */ + providerId?: string; + + /** + * IP range assigned to pods running on this node. + * Populated for Node resources. + */ + podCidr?: string; + + // ── EndpointSlice ────────────────────────────────────────────────────────── + + /** + * Address family for all endpoints in this EndpointSlice ('IPv4', 'IPv6', or 'FQDN'). + * Populated for EndpointSlice resources. + */ + endpointSliceAddressType?: string; + + /** + * Endpoints contained in this EndpointSlice. + * Populated for EndpointSlice resources. + */ + @identifiers(#[]) + endpointSliceEndpoints?: EndpointSliceEndpoint[]; + + /** + * Ports exposed by the endpoints in this EndpointSlice. + * Populated for EndpointSlice resources. + */ + @identifiers(#["name"]) + endpointSlicePorts?: EndpointSlicePort[]; + + // ── CertificateSigningRequest ────────────────────────────────────────────── + + /** + * Name of the signer that will sign the certificate (e.g., 'kubernetes.io/kube-apiserver-client'). + * Populated for CertificateSigningRequest resources. + */ + csrSignerName?: string; + + /** + * Name of the user that created the CertificateSigningRequest. + * Populated for CertificateSigningRequest resources. + */ + csrUsername?: string; + + /** + * Key usages requested for the certificate (e.g., 'client auth', 'server auth', 'digital signature'). + * Populated for CertificateSigningRequest resources. + */ + csrUsages?: string[]; + + /** + * Requested duration in seconds for the issued certificate. + * Populated for CertificateSigningRequest resources. + */ + csrExpirationSeconds?: int32; + + // ── CSIStorageCapacity ──────────────────────────────────────────────────── + + /** + * Available storage capacity for the StorageClass in this topology segment (e.g., '500Gi'). + * Populated for CSIStorageCapacity resources. + */ + storageCapacityAvailable?: string; + + /** + * Maximum size of a single volume that can be created in this topology segment. + * Populated for CSIStorageCapacity resources. + */ + maximumVolumeSize?: string; + + // ── ValidatingAdmissionPolicy ───────────────────────────────────────────── + + /** + * What happens when a policy evaluation fails: 'Fail' rejects the request; 'Ignore' allows it. + * Populated for ValidatingAdmissionPolicy resources. + */ + admissionPolicyFailurePolicy?: string; + + /** + * API resource rules that trigger this ValidatingAdmissionPolicy + * (e.g., 'CREATE pods', 'UPDATE deployments'). + * Each entry is a human-readable summary of a resource rule. + * Populated for ValidatingAdmissionPolicy resources. + */ + admissionPolicyMatchConstraints?: string[]; + + // ── ValidatingAdmissionPolicyBinding ───────────────────────────────────── + + /** + * Name of the ValidatingAdmissionPolicy this binding applies. + * Populated for ValidatingAdmissionPolicyBinding resources. + */ + admissionPolicyBindingPolicyName?: string; + + /** + * How validation failures are enforced: 'Deny', 'Warn', or 'Audit'. + * Populated for ValidatingAdmissionPolicyBinding resources. + */ + admissionPolicyValidationActions?: string[]; + + // ── Generic overflow ──────────────────────────────────────────────────────── + + /** + * Additional resource-specific fields not represented by the typed properties above. + * Used for uncommon fields and custom resource definition instances. + */ + @identifiers(#["name"]) + additionalFields?: KubernetesGenericField[]; +} + +/** + * Observed state (status) of a Kubernetes resource, written by the controller. + * + * Well-known fields for native workloads (Pod, Deployment, Service, etc.) are typed + * directly. Fields not covered by any typed property can be placed in additionalFields. + */ +model KubernetesResourceStatus { + // ── Universal ─────────────────────────────────────────────────────────────── + + /** Conditions reported by the controller managing this resource. */ + @identifiers(#["type"]) + conditions?: KubernetesCondition[]; + + /** + * High-level lifecycle phase of the resource. + * Examples: 'Running' / 'Pending' / 'Succeeded' / 'Failed' for Pod; + * 'Bound' / 'Pending' / 'Lost' for PersistentVolumeClaim; + * 'Active' / 'Terminating' for Namespace. + */ + phase?: string; + + /** Human-readable message summarizing the resource state. */ + message?: string; + + // ── Workload replica counters ──────────────────────────────────────────────── + + /** Total non-terminating pods targeted by this workload. Populated for Deployment, StatefulSet, ReplicaSet. */ + replicas?: int32; + + /** Number of pods ready to serve requests. Populated for Deployment, StatefulSet, DaemonSet. */ + readyReplicas?: int32; + + /** Number of pods available for at least minReadySeconds. Populated for Deployment, DaemonSet, StatefulSet. */ + availableReplicas?: int32; + + /** Pods running the current (desired) template spec. Populated for Deployment, StatefulSet, DaemonSet. */ + updatedReplicas?: int32; + + /** Pods required but not yet available. Populated for Deployment resources. */ + unavailableReplicas?: int32; + + /** + * Pods running the previous revision (before update completes). + * Populated for StatefulSet resources. + */ + currentReplicas?: int32; + + /** + * Name of the StatefulSet revision corresponding to currentReplicas. + * Populated for StatefulSet resources. + */ + currentRevision?: string; + + /** + * Name of the StatefulSet revision applied to updatedReplicas. + * Populated for StatefulSet resources. + */ + updateRevision?: string; + + /** + * Desired replica count calculated by the HorizontalPodAutoscaler. + * Populated for HorizontalPodAutoscaler resources. + */ + desiredReplicas?: int32; + + /** + * Pods that are terminating but not yet removed from the endpoints. + * Populated for Deployment and ReplicaSet resources. + */ + terminatingReplicas?: int32; + + // ── DaemonSet scheduling counters ──────────────────────────────────────────── + + /** Total nodes that should run the daemon pod. Populated for DaemonSet resources. */ + desiredNumberScheduled?: int32; + + /** Nodes running at least one daemon pod. Populated for DaemonSet resources. */ + currentNumberScheduled?: int32; + + /** Nodes with a Ready daemon pod. Populated for DaemonSet resources. */ + numberReady?: int32; + + /** + * Nodes running the daemon pod that should not be running it. + * Populated for DaemonSet resources. + */ + numberMisscheduled?: int32; + + /** Nodes missing an available daemon pod. Populated for DaemonSet resources. */ + numberUnavailable?: int32; + + // ── Pod ───────────────────────────────────────────────────────────────────── + + /** IP address allocated to the pod within the cluster. Populated for Pod resources. */ + podIp?: string; + + /** Additional pod IPs assigned in multi-network or dual-stack clusters. Populated for Pod resources. */ + podIps?: string[]; + + /** IP address of the node hosting the pod. Populated for Pod resources. */ + hostIp?: string; + + /** Additional host IPs for dual-stack nodes. Populated for Pod resources. */ + hostIps?: string[]; + + /** UTC timestamp when the pod was accepted by the scheduler. Populated for Pod resources. */ + startTime?: utcDateTime; + + /** + * Runtime status of each container in the pod. + * Populated for Pod resources. + */ + @identifiers(#["name"]) + containerStatuses?: ContainerStatus[]; + + /** + * Runtime status of each init container in the pod. + * Populated for Pod resources. + */ + @identifiers(#["name"]) + initContainerStatuses?: ContainerStatus[]; + + /** + * QoS class assigned by Kubernetes based on resource requests and limits. + * One of 'Guaranteed', 'Burstable', or 'BestEffort'. Populated for Pod resources. + */ + qosClass?: string; + + /** + * Brief CamelCase reason for the pod's current state (e.g., 'Evicted', 'OOMKilled'). + * Populated for Pod resources. + */ + reason?: string; + + /** + * Most recent generation observed by the controller. + * Populated for Deployment, StatefulSet, DaemonSet, and Pod resources. + */ + observedGeneration?: int64; + + // ── Job / CronJob ───────────────────────────────────────────────────────────── + + /** Number of currently active (running or pending) pods. Populated for Job resources. */ + activeJobCount?: int32; + + /** Number of pods that completed successfully. Populated for Job resources. */ + succeededJobCount?: int32; + + /** Number of pods that failed. Populated for Job resources. */ + failedJobCount?: int32; + + /** Number of pods in ready state for a Job. Populated for Job resources. */ + readyPods?: int32; + + /** UTC timestamp when the Job started executing. Populated for Job resources. */ + jobStartTime?: utcDateTime; + + /** UTC timestamp when the Job completed successfully. Populated for Job resources. */ + jobCompletionTime?: utcDateTime; + + /** UTC timestamp when the CronJob last successfully scheduled a Job. */ + lastScheduleTime?: utcDateTime; + + /** UTC timestamp when the last Job triggered by this CronJob completed successfully. */ + lastSuccessfulTime?: utcDateTime; + + // ── Service / Ingress ───────────────────────────────────────────────────────── + + /** + * External IP addresses or hostnames assigned to LoadBalancer Services or Ingress resources. + * Populated for Service (type LoadBalancer) and Ingress resources. + */ + loadBalancerIngress?: string[]; + + /** + * UTC timestamp of the most recent scaling event triggered by the HPA. + * Populated for HorizontalPodAutoscaler resources. + */ + lastScaleTime?: utcDateTime; + + // ── Node ────────────────────────────────────────────────────────────────────── + + /** + * Network addresses of the node (InternalIP, ExternalIP, Hostname). + * Populated for Node resources. + */ + @identifiers(#["address"]) + nodeAddresses?: NodeAddress[]; + + /** + * Operating system and runtime information for the node. + * Populated for Node resources. + */ + nodeInfo?: NodeSystemInfo; + + /** + * Total hardware resources of the node (cpu, memory, pods, ephemeral-storage). + * Populated for Node resources. + */ + nodeCapacity?: NodeResourceMap; + + /** + * Resources available for scheduling after system reservation. + * Populated for Node resources. + */ + nodeAllocatable?: NodeResourceMap; + + /** + * Volumes that have been successfully attached to the node by the attach/detach controller. + * Populated for Node resources. + */ + @identifiers(#["name"]) + volumesAttached?: AttachedVolume[]; + + // ── PDB ─────────────────────────────────────────────────────────────────────── + + /** Currently healthy (Ready) pods counted by the PodDisruptionBudget. */ + currentHealthy?: int32; + + /** Minimum healthy pods required by the PodDisruptionBudget. */ + desiredHealthy?: int32; + + /** Number of pod disruptions currently allowed by the PodDisruptionBudget. */ + disruptionsAllowed?: int32; + + /** Total number of pods counted by the PodDisruptionBudget (ready + not ready). */ + expectedPods?: int32; + + // ── PVC ─────────────────────────────────────────────────────────────────────── + + /** + * Actual provisioned storage capacity for the PVC after binding (e.g., '10Gi'). + * Populated for PersistentVolumeClaim resources. + */ + pvcCapacity?: string; + + /** + * Access modes granted to the PVC after it is bound to a PV. + * Populated for PersistentVolumeClaim resources. + */ + pvcAccessModes?: string[]; + + // ── VolumeAttachment ──────────────────────────────────────────────────────── + + /** + * When true, the volume is successfully attached to the target node. + * Populated for VolumeAttachment resources. + */ + volumeAttached?: boolean; + + // ── Generic overflow ──────────────────────────────────────────────────────── + + /** + * Additional resource-specific status fields not represented by the typed properties above. + * Used for uncommon fields and custom resource definition instances. + */ + @identifiers(#["name"]) + additionalFields?: KubernetesGenericField[]; +} + +// ─── Kubernetes event ───────────────────────────────────────────────────────── + +/** A Kubernetes event recorded against a resource (equivalent to `kubectl describe` Events). */ +model KubernetesEvent { + /** Event type: 'Normal' or 'Warning'. */ + type?: string; + + /** Short machine-readable reason for the event (e.g., 'Scheduled', 'Pulled', 'Failed'). */ + reason: string; + + /** + * Human-readable elapsed time since the event last occurred + * as reported by the Kubernetes API (e.g., '2m28s', '5h'). + */ + age?: string; + + /** + * Component that emitted the event + * (e.g., 'default-scheduler', 'kubelet'). + */ + from?: string; + + /** Human-readable description of the event. */ + message?: string; +} + +// ─── ARM resource properties ────────────────────────────────────────────────── + +/** + * Properties of a single KubernetesResources ARM resource. + * Each ARM resource represents one Kubernetes object from the cluster inventory. + * The ARM resource name encodes the kind, Kubernetes name, and namespace + * (e.g., 'pod-nginx-6d4cf56db6-x7q2p-default', 'upgrade-assessment-current-kube-system'). + */ +#suppress "@azure-tools/typespec-azure-resource-manager/arm-resource-provisioning-state" "This resource does not have a provisioning state per the original Swagger design" +model KubernetesResourceProperties { + /** + * Kubernetes API version of the represented resource + * (e.g., 'v1', 'apps/v1', 'upgrade.config.io/v1alpha1'). + */ + @visibility(Lifecycle.Read) + apiVersion?: string; + + /** Kind of the Kubernetes resource (e.g., 'Pod', 'Deployment', 'Service'). */ + @visibility(Lifecycle.Read) + kind?: string; + + /** Standard Kubernetes object metadata. */ + @visibility(Lifecycle.Read) + metadata?: KubernetesObjectMeta; + + /** Desired state of the Kubernetes resource. */ + @visibility(Lifecycle.Read) + spec?: KubernetesResourceSpec; + + /** Observed state of the Kubernetes resource, written by the controller. */ + @visibility(Lifecycle.Read) + status?: KubernetesResourceStatus; + + /** Kubernetes events recorded against this resource. */ + @visibility(Lifecycle.Read) + @identifiers(#[]) + events?: KubernetesEvent[]; + + /** Name of the extension this inventory resource is attached to. */ + @visibility(Lifecycle.Read) + attachedToExtension?: string; +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/KubernetesResources.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/KubernetesResources.json new file mode 100644 index 000000000000..f6ed0044486c --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/KubernetesResources.json @@ -0,0 +1,2380 @@ +{ + "swagger": "2.0", + "info": { + "title": "KubernetesResourcesClient", + "version": "2026-06-15-preview", + "description": "APIs for K8s inventory reports under Microsoft.KubernetesConfiguration.", + "x-typespec-generated": [ + { + "emitter": "@azure-tools/typespec-autorest" + } + ] + }, + "schemes": [ + "https" + ], + "host": "management.azure.com", + "produces": [ + "application/json" + ], + "consumes": [ + "application/json" + ], + "security": [ + { + "azure_auth": [ + "user_impersonation" + ] + } + ], + "securityDefinitions": { + "azure_auth": { + "type": "oauth2", + "description": "Azure Active Directory OAuth2 Flow.", + "flow": "implicit", + "authorizationUrl": "https://login.microsoftonline.com/common/oauth2/authorize", + "scopes": { + "user_impersonation": "impersonate your user account" + } + } + }, + "tags": [ + { + "name": "KubernetesResources" + } + ], + "paths": { + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{clusterRp}/{clusterResourceName}/{clusterName}/providers/Microsoft.KubernetesConfiguration/kubernetesResources": { + "get": { + "operationId": "KubernetesResources_List", + "tags": [ + "KubernetesResources" + ], + "description": "List kubernetesResources containers for the cluster (currently always a single 'default').", + "parameters": [ + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "clusterRp", + "in": "path", + "description": "The Kubernetes cluster RP - i.e. Microsoft.ContainerService, Microsoft.Kubernetes,\nMicrosoft.HybridContainerService, Microsoft.KubernetesConfiguration.", + "required": true, + "type": "string", + "pattern": "^Microsoft\\.(ContainerService|Kubernetes|HybridContainerService|KubernetesConfiguration)$" + }, + { + "name": "clusterResourceName", + "in": "path", + "description": "The Kubernetes cluster resource name - i.e. managedClusters, connectedClusters,\nprovisionedClusters, appliances.", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z]+$" + }, + { + "name": "clusterName", + "in": "path", + "description": "The name of the kubernetes cluster.", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9-_.]{0,62}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/KubernetesResourceListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-examples": { + "List KubernetesResources": { + "$ref": "./examples/ListKubernetesResources.json" + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{clusterRp}/{clusterResourceName}/{clusterName}/providers/Microsoft.KubernetesConfiguration/kubernetesResources/{kubernetesResourceName}": { + "get": { + "operationId": "KubernetesResources_Get", + "tags": [ + "KubernetesResources" + ], + "description": "Get the kubernetesResources singleton for a cluster.", + "parameters": [ + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "clusterRp", + "in": "path", + "description": "The Kubernetes cluster RP - i.e. Microsoft.ContainerService, Microsoft.Kubernetes,\nMicrosoft.HybridContainerService, Microsoft.KubernetesConfiguration.", + "required": true, + "type": "string", + "pattern": "^Microsoft\\.(ContainerService|Kubernetes|HybridContainerService|KubernetesConfiguration)$" + }, + { + "name": "clusterResourceName", + "in": "path", + "description": "The Kubernetes cluster resource name - i.e. managedClusters, connectedClusters,\nprovisionedClusters, appliances.", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z]+$" + }, + { + "name": "clusterName", + "in": "path", + "description": "The name of the kubernetes cluster.", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9-_.]{0,62}$" + }, + { + "name": "kubernetesResourceName", + "in": "path", + "description": "Name of the KubernetesResources resource.", + "required": true, + "type": "string", + "pattern": "^[a-z]([a-z0-9._-]{0,126}[a-z0-9])?$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/KubernetesResource" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-examples": { + "Get KubernetesResources": { + "$ref": "./examples/GetKubernetesResources.json" + }, + "Get KubernetesResources - CSIStorageCapacity": { + "$ref": "./examples/GetKubernetesResources-CSIStorageCapacity.json" + }, + "Get KubernetesResources - CertificateSigningRequest": { + "$ref": "./examples/GetKubernetesResources-CertificateSigningRequest.json" + }, + "Get KubernetesResources - ConfigMap": { + "$ref": "./examples/GetKubernetesResources-ConfigMap.json" + }, + "Get KubernetesResources - CronJob": { + "$ref": "./examples/GetKubernetesResources-CronJob.json" + }, + "Get KubernetesResources - DaemonSet": { + "$ref": "./examples/GetKubernetesResources-DaemonSet.json" + }, + "Get KubernetesResources - Deployment": { + "$ref": "./examples/GetKubernetesResources-Deployment.json" + }, + "Get KubernetesResources - EndpointSlice": { + "$ref": "./examples/GetKubernetesResources-EndpointSlice.json" + }, + "Get KubernetesResources - HorizontalPodAutoscaler": { + "$ref": "./examples/GetKubernetesResources-HorizontalPodAutoscaler.json" + }, + "Get KubernetesResources - Ingress": { + "$ref": "./examples/GetKubernetesResources-Ingress.json" + }, + "Get KubernetesResources - IngressClass": { + "$ref": "./examples/GetKubernetesResources-IngressClass.json" + }, + "Get KubernetesResources - Job": { + "$ref": "./examples/GetKubernetesResources-Job.json" + }, + "Get KubernetesResources - NetworkPolicy": { + "$ref": "./examples/GetKubernetesResources-NetworkPolicy.json" + }, + "Get KubernetesResources - Node": { + "$ref": "./examples/GetKubernetesResources-Node.json" + }, + "Get KubernetesResources - PersistentVolume": { + "$ref": "./examples/GetKubernetesResources-PersistentVolume.json" + }, + "Get KubernetesResources - PersistentVolumeClaim": { + "$ref": "./examples/GetKubernetesResources-PersistentVolumeClaim.json" + }, + "Get KubernetesResources - Pod": { + "$ref": "./examples/GetKubernetesResources-Pod.json" + }, + "Get KubernetesResources - PodDisruptionBudget": { + "$ref": "./examples/GetKubernetesResources-PodDisruptionBudget.json" + }, + "Get KubernetesResources - ReplicaSet": { + "$ref": "./examples/GetKubernetesResources-ReplicaSet.json" + }, + "Get KubernetesResources - Role": { + "$ref": "./examples/GetKubernetesResources-Role.json" + }, + "Get KubernetesResources - RoleBinding": { + "$ref": "./examples/GetKubernetesResources-RoleBinding.json" + }, + "Get KubernetesResources - Service": { + "$ref": "./examples/GetKubernetesResources-Service.json" + }, + "Get KubernetesResources - ServiceAccount": { + "$ref": "./examples/GetKubernetesResources-ServiceAccount.json" + }, + "Get KubernetesResources - StatefulSet": { + "$ref": "./examples/GetKubernetesResources-StatefulSet.json" + }, + "Get KubernetesResources - StorageClass": { + "$ref": "./examples/GetKubernetesResources-StorageClass.json" + }, + "Get KubernetesResources - ValidatingAdmissionPolicy": { + "$ref": "./examples/GetKubernetesResources-ValidatingAdmissionPolicy.json" + }, + "Get KubernetesResources - ValidatingAdmissionPolicyBinding": { + "$ref": "./examples/GetKubernetesResources-ValidatingAdmissionPolicyBinding.json" + }, + "Get KubernetesResources - VolumeAttachment": { + "$ref": "./examples/GetKubernetesResources-VolumeAttachment.json" + } + } + } + } + }, + "definitions": { + "AttachedVolume": { + "type": "object", + "description": "A volume attached to a Kubernetes Node by the attach/detach controller.", + "properties": { + "name": { + "type": "string", + "description": "Name of the attached volume (matches the PersistentVolume name)." + }, + "devicePath": { + "type": "string", + "description": "Device path on the node where the volume is attached (e.g., '/dev/sdc')." + } + }, + "required": [ + "name" + ] + }, + "Capabilities": { + "type": "object", + "description": "Linux capability set to add to or drop from a container's default capabilities.", + "properties": { + "add": { + "type": "array", + "description": "Capabilities to add (e.g., 'NET_ADMIN').", + "items": { + "type": "string" + } + }, + "drop": { + "type": "array", + "description": "Capabilities to remove (e.g., 'ALL').", + "items": { + "type": "string" + } + } + } + }, + "ConditionStatus": { + "type": "string", + "description": "Whether a Kubernetes condition is currently active.", + "enum": [ + "True", + "False", + "Unknown" + ], + "x-ms-enum": { + "name": "ConditionStatus", + "modelAsString": true, + "values": [ + { + "name": "True", + "value": "True", + "description": "Condition is currently true." + }, + { + "name": "False", + "value": "False", + "description": "Condition is currently false." + }, + { + "name": "Unknown", + "value": "Unknown", + "description": "Condition state cannot be determined." + } + ] + } + }, + "ContainerPortInfo": { + "type": "object", + "description": "A port exposed by a container.", + "properties": { + "containerPort": { + "type": "integer", + "format": "int32", + "description": "Port number exposed inside the container." + }, + "protocol": { + "$ref": "#/definitions/NetworkProtocol", + "description": "Network protocol for this port." + }, + "name": { + "type": "string", + "description": "Optional name for this port." + }, + "hostPort": { + "type": "integer", + "format": "int32", + "description": "Port number to expose on the host node." + }, + "hostIp": { + "type": "string", + "description": "Host IP to bind the hostPort on." + } + }, + "required": [ + "containerPort" + ] + }, + "ContainerProbe": { + "type": "object", + "description": "Simplified health probe configuration for a container.\nCaptures the probe mechanism type and the primary target (path or port).\nDetailed timing parameters (initialDelaySeconds, periodSeconds, etc.) can be stored in additionalFields.", + "properties": { + "type": { + "type": "string", + "description": "Probe mechanism: 'HTTPGet', 'TCPSocket', 'Exec', or 'GRPC'." + }, + "path": { + "type": "string", + "description": "URL path for HTTPGet probes (e.g., '/healthz', '/readyz')." + }, + "port": { + "type": "integer", + "format": "int32", + "description": "Port number for HTTPGet or TCPSocket probes." + } + } + }, + "ContainerResourceQuantity": { + "type": "object", + "description": "CPU and memory resource quantities for a container.\nValues use Kubernetes resource notation: CPU as millicores (e.g., '500m', '2')\nand memory as byte-unit strings (e.g., '256Mi', '1Gi').\nSee: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", + "properties": { + "cpu": { + "type": "string", + "description": "CPU quantity (e.g., '500m' for 500 millicores, '2' for 2 cores)." + }, + "memory": { + "type": "string", + "description": "Memory quantity (e.g., '256Mi', '1Gi')." + } + } + }, + "ContainerResourceRequirements": { + "type": "object", + "description": "CPU and memory resource declarations for a container.", + "properties": { + "limits": { + "$ref": "#/definitions/ContainerResourceQuantity", + "description": "Maximum resources the container may consume." + }, + "requests": { + "$ref": "#/definitions/ContainerResourceQuantity", + "description": "Minimum resources the container requires to be scheduled." + } + } + }, + "ContainerSecurityContext": { + "type": "object", + "description": "Security context applied to a single container.", + "properties": { + "capabilities": { + "$ref": "#/definitions/Capabilities", + "description": "Linux capability adjustments for this container." + }, + "privileged": { + "type": "boolean", + "description": "When true, the container runs with full host privileges (root + all Linux capabilities)." + }, + "readOnlyRootFilesystem": { + "type": "boolean", + "description": "Mount the container's root filesystem as read-only when true." + }, + "allowPrivilegeEscalation": { + "type": "boolean", + "description": "Prevent the container process from gaining more privileges than its parent when false." + }, + "runAsNonRoot": { + "type": "boolean", + "description": "Require the container to run as a non-root user when true." + }, + "runAsUser": { + "type": "integer", + "format": "int64", + "description": "UID to run the container process as." + }, + "runAsGroup": { + "type": "integer", + "format": "int64", + "description": "GID to run the container process as." + }, + "seccompProfile": { + "type": "string", + "description": "Seccomp profile type applied to this container ('RuntimeDefault', 'Unconfined', or 'Localhost')." + } + } + }, + "ContainerSpec": { + "type": "object", + "description": "Specification of a single container within a pod.", + "properties": { + "name": { + "type": "string", + "description": "Name of the container, unique within the pod." + }, + "image": { + "type": "string", + "description": "Container image reference (e.g., 'nginx:1.25')." + }, + "imagePullPolicy": { + "type": "string", + "description": "Image pull policy for this container ('Always', 'IfNotPresent', or 'Never')." + }, + "ports": { + "type": "array", + "description": "Ports to expose from the container.", + "items": { + "$ref": "#/definitions/ContainerPortInfo" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "env": { + "type": "array", + "description": "Environment variables to set in the container.", + "items": { + "$ref": "#/definitions/EnvVar" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "envFrom": { + "type": "array", + "description": "Sources that populate environment variables in bulk from ConfigMaps or Secrets.", + "items": { + "$ref": "#/definitions/EnvFromSource" + }, + "x-ms-identifiers": [] + }, + "resources": { + "$ref": "#/definitions/ContainerResourceRequirements", + "description": "Compute resource requests and limits." + }, + "command": { + "type": "array", + "description": "Command to override the container default ENTRYPOINT.", + "items": { + "type": "string" + } + }, + "args": { + "type": "array", + "description": "Arguments to override the container default CMD.", + "items": { + "type": "string" + } + }, + "volumeMounts": { + "type": "array", + "description": "Volume paths to mount inside the container.", + "items": { + "$ref": "#/definitions/VolumeMount" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "securityContext": { + "$ref": "#/definitions/ContainerSecurityContext", + "description": "Security context applied to this container." + }, + "livenessProbe": { + "$ref": "#/definitions/ContainerProbe", + "description": "Liveness probe that determines when to restart the container." + }, + "readinessProbe": { + "$ref": "#/definitions/ContainerProbe", + "description": "Readiness probe that determines when the container is ready to accept traffic." + } + }, + "required": [ + "name" + ] + }, + "ContainerState": { + "type": "object", + "description": "Current or previous state of a container; exactly one of the three fields is populated.", + "properties": { + "running": { + "$ref": "#/definitions/ContainerStateRunning", + "description": "Populated when the container is currently executing." + }, + "terminated": { + "$ref": "#/definitions/ContainerStateTerminated", + "description": "Populated when the container has exited." + }, + "waiting": { + "$ref": "#/definitions/ContainerStateWaiting", + "description": "Populated when the container is not yet running." + } + } + }, + "ContainerStateRunning": { + "type": "object", + "description": "State of a currently running container.", + "properties": { + "startedAt": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp when the container started." + } + } + }, + "ContainerStateTerminated": { + "type": "object", + "description": "State of a terminated container.", + "properties": { + "exitCode": { + "type": "integer", + "format": "int32", + "description": "Exit code of the container process." + }, + "signal": { + "type": "integer", + "format": "int32", + "description": "Signal that caused the container to terminate, if applicable." + }, + "reason": { + "type": "string", + "description": "Machine-readable reason for termination (e.g., 'OOMKilled', 'Completed')." + }, + "message": { + "type": "string", + "description": "Human-readable message about the termination." + }, + "startedAt": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp when the container started its last execution." + }, + "finishedAt": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp when the container terminated." + } + }, + "required": [ + "exitCode" + ] + }, + "ContainerStateWaiting": { + "type": "object", + "description": "State of a container that is not yet running.", + "properties": { + "reason": { + "type": "string", + "description": "Machine-readable reason the container is not running (e.g., 'ContainerCreating', 'ImagePullBackOff')." + }, + "message": { + "type": "string", + "description": "Human-readable message about the waiting state." + } + } + }, + "ContainerStatus": { + "type": "object", + "description": "Runtime status of a single container as reported in the pod status.", + "properties": { + "name": { + "type": "string", + "description": "Name of the container." + }, + "ready": { + "type": "boolean", + "description": "True when the container has passed its readiness probe." + }, + "restartCount": { + "type": "integer", + "format": "int32", + "description": "Number of times the container has restarted since the pod was started." + }, + "image": { + "type": "string", + "description": "Container image including digest as resolved by the runtime." + }, + "started": { + "type": "boolean", + "description": "Whether the container has passed its startup probe and is considered started." + }, + "state": { + "$ref": "#/definitions/ContainerState", + "description": "Current state of the container." + }, + "lastState": { + "$ref": "#/definitions/ContainerState", + "description": "Previous termination state of the container; populated after a restart." + }, + "containerId": { + "type": "string", + "description": "Opaque container runtime identifier (e.g., 'containerd://sha256:...')." + } + }, + "required": [ + "name" + ] + }, + "EndpointSliceEndpoint": { + "type": "object", + "description": "A single endpoint within an EndpointSlice (address + readiness + scheduling hints).", + "properties": { + "addresses": { + "type": "array", + "description": "IP addresses (IPv4/IPv6) or FQDNs serving this endpoint.", + "items": { + "type": "string" + } + }, + "ready": { + "type": "boolean", + "description": "True when the endpoint is ready to receive traffic." + }, + "nodeName": { + "type": "string", + "description": "Name of the node hosting this endpoint." + }, + "targetRefKind": { + "type": "string", + "description": "Kind of the backing object (typically 'Pod')." + }, + "targetRefName": { + "type": "string", + "description": "Name of the backing object." + }, + "targetRefNamespace": { + "type": "string", + "description": "Namespace of the backing object." + } + }, + "required": [ + "addresses" + ] + }, + "EndpointSlicePort": { + "type": "object", + "description": "A port entry in an EndpointSlice.", + "properties": { + "port": { + "type": "integer", + "format": "int32", + "description": "Port number." + }, + "protocol": { + "$ref": "#/definitions/NetworkProtocol", + "description": "Network protocol ('TCP', 'UDP', or 'SCTP')." + }, + "name": { + "type": "string", + "description": "Optional name for this port." + } + }, + "required": [ + "port" + ] + }, + "EnvFromSource": { + "type": "object", + "description": "A source for bulk-importing environment variables into a container from a ConfigMap or Secret.", + "properties": { + "configMapRef": { + "type": "string", + "description": "Name of the ConfigMap whose keys are imported as environment variables." + }, + "secretRef": { + "type": "string", + "description": "Name of the Secret whose keys are imported as environment variables." + }, + "prefix": { + "type": "string", + "description": "Optional prefix prepended to each imported environment variable name." + } + } + }, + "EnvVar": { + "type": "object", + "description": "An environment variable set in a container.", + "properties": { + "name": { + "type": "string", + "description": "Name of the environment variable." + }, + "value": { + "type": "string", + "description": "Literal string value." + } + }, + "required": [ + "name" + ] + }, + "IngressPath": { + "type": "object", + "description": "An HTTP path rule within an Ingress host entry, mapping a URL path to a backend Service.", + "properties": { + "path": { + "type": "string", + "description": "URL path to match (e.g., '/api', '/')." + }, + "pathType": { + "type": "string", + "description": "Path matching semantics ('Exact', 'Prefix', or 'ImplementationSpecific')." + }, + "serviceName": { + "type": "string", + "description": "Name of the backend Service receiving matched traffic." + }, + "servicePort": { + "type": "string", + "description": "Port of the backend Service (numeric string or named port)." + } + }, + "required": [ + "serviceName" + ] + }, + "IngressRule": { + "type": "object", + "description": "A host-level routing rule in an Ingress resource.", + "properties": { + "host": { + "type": "string", + "description": "Fully qualified domain name or wildcard host (e.g., 'api.example.com', '*.example.com')." + }, + "paths": { + "type": "array", + "description": "HTTP path rules mapping URL paths to backend Services.", + "items": { + "$ref": "#/definitions/IngressPath" + }, + "x-ms-identifiers": [] + } + } + }, + "IngressTls": { + "type": "object", + "description": "TLS configuration entry for an Ingress resource.", + "properties": { + "hosts": { + "type": "array", + "description": "Hostnames covered by this TLS certificate.", + "items": { + "type": "string" + } + }, + "secretName": { + "type": "string", + "description": "Name of the Secret containing the TLS certificate and private key." + } + } + }, + "KubernetesAnnotation": { + "type": "object", + "description": "A single Kubernetes annotation (key/value pair for non-identifying auxiliary metadata).", + "properties": { + "name": { + "type": "string", + "description": "Annotation key (e.g., 'kubectl.kubernetes.io/last-applied-configuration').", + "readOnly": true + }, + "value": { + "type": "string", + "description": "Annotation value." + } + }, + "required": [ + "name" + ] + }, + "KubernetesCondition": { + "type": "object", + "description": "A Kubernetes-style status condition reported by a controller.", + "properties": { + "type": { + "type": "string", + "description": "Type of the condition (e.g., 'Ready', 'Available', 'Progressing')." + }, + "status": { + "$ref": "#/definitions/ConditionStatus", + "description": "Whether the condition is currently active." + }, + "reason": { + "type": "string", + "description": "Machine-readable reason code for the current status." + }, + "message": { + "type": "string", + "description": "Human-readable explanation of the current status." + }, + "lastTransitionTime": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp of the last status transition." + } + }, + "required": [ + "type" + ] + }, + "KubernetesEvent": { + "type": "object", + "description": "A Kubernetes event recorded against a resource (equivalent to `kubectl describe` Events).", + "properties": { + "type": { + "type": "string", + "description": "Event type: 'Normal' or 'Warning'." + }, + "reason": { + "type": "string", + "description": "Short machine-readable reason for the event (e.g., 'Scheduled', 'Pulled', 'Failed')." + }, + "age": { + "type": "string", + "description": "Human-readable elapsed time since the event last occurred\nas reported by the Kubernetes API (e.g., '2m28s', '5h')." + }, + "from": { + "type": "string", + "description": "Component that emitted the event\n(e.g., 'default-scheduler', 'kubelet')." + }, + "message": { + "type": "string", + "description": "Human-readable description of the event." + } + }, + "required": [ + "reason" + ] + }, + "KubernetesGenericField": { + "type": "object", + "description": "A generic recursive field node used to represent resource-specific fields\nthat are not captured by the typed properties on KubernetesResourceSpec\nor KubernetesResourceStatus (e.g., uncommon fields and CRD-specific data).", + "properties": { + "name": { + "type": "string", + "description": "Field name.", + "readOnly": true + }, + "value": { + "type": "string", + "description": "The string value of the field." + } + }, + "required": [ + "name" + ] + }, + "KubernetesLabel": { + "type": "object", + "description": "A single Kubernetes label (key/value pair used for selection and grouping).", + "properties": { + "name": { + "type": "string", + "description": "Label key (e.g., 'app.kubernetes.io/name').", + "readOnly": true + }, + "value": { + "type": "string", + "description": "Label value." + } + }, + "required": [ + "name" + ] + }, + "KubernetesObjectMeta": { + "type": "object", + "description": "Metadata common to all Kubernetes objects (subset of ObjectMeta).", + "properties": { + "name": { + "type": "string", + "description": "Name of the Kubernetes object, unique within its namespace." + }, + "namespaceName": { + "type": "string", + "description": "Namespace the object belongs to.\nEmpty for cluster-scoped resources such as Node and Namespace." + }, + "uid": { + "type": "string", + "description": "Immutable UID assigned by the Kubernetes API server." + }, + "resourceVersion": { + "type": "string", + "description": "Opaque version string used for optimistic concurrency.\nClients must treat this as opaque and pass it unmodified on updates." + }, + "generation": { + "type": "integer", + "format": "int64", + "description": "Sequence number incremented each time the object spec changes." + }, + "creationTimestamp": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp when the object was created." + }, + "deletionTimestamp": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp set when a graceful deletion has been requested.\nAbsent when the object is not being deleted." + }, + "labels": { + "type": "array", + "description": "User-defined key/value pairs used for selection and grouping.", + "items": { + "$ref": "#/definitions/KubernetesLabel" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "annotations": { + "type": "array", + "description": "Key/value pairs for non-identifying auxiliary metadata.", + "items": { + "$ref": "#/definitions/KubernetesAnnotation" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "ownerReferences": { + "type": "array", + "description": "References to the objects that own this object (e.g., the ReplicaSet that owns a Pod).", + "items": { + "$ref": "#/definitions/OwnerReference" + }, + "x-ms-identifiers": [ + "uid" + ] + }, + "finalizers": { + "type": "array", + "description": "Named lifecycle hooks that must be resolved before the object is deleted.", + "items": { + "type": "string" + } + } + }, + "required": [ + "name" + ] + }, + "KubernetesResource": { + "type": "object", + "description": "Singleton container resource grouping cluster inventory reports.", + "properties": { + "properties": { + "$ref": "#/definitions/KubernetesResourceProperties", + "description": "Properties of the KubernetesResources resource." + } + }, + "allOf": [ + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/definitions/ProxyResource" + } + ] + }, + "KubernetesResourceListResult": { + "type": "object", + "description": "The response of a KubernetesResource list operation.", + "properties": { + "value": { + "type": "array", + "description": "The KubernetesResource items on this page", + "items": { + "$ref": "#/definitions/KubernetesResource" + } + }, + "nextLink": { + "type": "string", + "format": "uri", + "description": "The link to the next page of items" + } + }, + "required": [ + "value" + ] + }, + "KubernetesResourceProperties": { + "type": "object", + "description": "Properties of a single KubernetesResources ARM resource.\nEach ARM resource represents one Kubernetes object from the cluster inventory.\nThe ARM resource name encodes the kind, Kubernetes name, and namespace\n(e.g., 'pod-nginx-6d4cf56db6-x7q2p-default', 'upgrade-assessment-current-kube-system').", + "properties": { + "apiVersion": { + "type": "string", + "description": "Kubernetes API version of the represented resource\n(e.g., 'v1', 'apps/v1', 'upgrade.config.io/v1alpha1').", + "readOnly": true + }, + "kind": { + "type": "string", + "description": "Kind of the Kubernetes resource (e.g., 'Pod', 'Deployment', 'Service').", + "readOnly": true + }, + "metadata": { + "$ref": "#/definitions/KubernetesObjectMeta", + "description": "Standard Kubernetes object metadata.", + "readOnly": true + }, + "spec": { + "$ref": "#/definitions/KubernetesResourceSpec", + "description": "Desired state of the Kubernetes resource.", + "readOnly": true + }, + "status": { + "$ref": "#/definitions/KubernetesResourceStatus", + "description": "Observed state of the Kubernetes resource, written by the controller.", + "readOnly": true + }, + "events": { + "type": "array", + "description": "Kubernetes events recorded against this resource.", + "items": { + "$ref": "#/definitions/KubernetesEvent" + }, + "readOnly": true, + "x-ms-identifiers": [] + }, + "attachedToExtension": { + "type": "string", + "description": "Name of the extension this inventory resource is attached to.", + "readOnly": true + } + } + }, + "KubernetesResourceSpec": { + "type": "object", + "description": "Desired state (spec) of a Kubernetes resource.\n\nWell-known fields for native workloads (Pod, Deployment, Service, etc.) are typed\ndirectly. Fields not covered by any typed property can be placed in additionalFields.", + "properties": { + "nodeName": { + "type": "string", + "description": "Name of the node the pod is scheduled on. Populated for Pod resources." + }, + "restartPolicy": { + "type": "string", + "description": "Pod restart policy (e.g., 'Always', 'OnFailure', 'Never'). Populated for Pod resources." + }, + "containers": { + "type": "array", + "description": "Containers belonging to the pod or pod template.\nPopulated for Pod, Deployment, StatefulSet, and DaemonSet resources.", + "items": { + "$ref": "#/definitions/ContainerSpec" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "initContainers": { + "type": "array", + "description": "Init containers that run before app containers start.\nPopulated for Pod, Deployment, StatefulSet, and DaemonSet resources.", + "items": { + "$ref": "#/definitions/ContainerSpec" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "terminationGracePeriodSeconds": { + "type": "integer", + "format": "int64", + "description": "Grace period in seconds before forcibly terminating the pod on deletion." + }, + "nodeSelector": { + "type": "array", + "description": "Node label selector constraining which nodes this pod may be scheduled on.\nPopulated for Pod, Deployment, StatefulSet, and DaemonSet resources.", + "items": { + "$ref": "#/definitions/KubernetesLabel" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "priorityClassName": { + "type": "string", + "description": "Name of the PriorityClass governing scheduling priority and preemption for this pod.\nPopulated for Pod, Deployment, StatefulSet, and DaemonSet resources." + }, + "hostNetwork": { + "type": "boolean", + "description": "When true, the pod uses the host network namespace (disables pod network isolation).\nPopulated for Pod resources." + }, + "hostPid": { + "type": "boolean", + "description": "When true, the pod shares the host PID namespace. Populated for Pod resources." + }, + "hostIpc": { + "type": "boolean", + "description": "When true, the pod shares the host IPC namespace. Populated for Pod resources." + }, + "runtimeClassName": { + "type": "string", + "description": "Name of the RuntimeClass for sandbox or specialized container runtimes\n(e.g., 'gvisor', 'kata-containers'). Populated for Pod resources." + }, + "imagePullSecrets": { + "type": "array", + "description": "Names of Secrets used to authenticate image pulls from private registries.\nPopulated for Pod, Deployment, StatefulSet, and DaemonSet resources.", + "items": { + "type": "string" + } + }, + "podOs": { + "type": "string", + "description": "Operating system of the containers ('linux' or 'windows').\nPopulated for Pod resources." + }, + "replicas": { + "type": "integer", + "format": "int32", + "description": "Desired number of pod replicas. Populated for Deployment and StatefulSet resources." + }, + "serviceName": { + "type": "string", + "description": "Headless service name governing StatefulSet pod network identity.\nPopulated for StatefulSet resources." + }, + "selector": { + "type": "array", + "description": "Label selector identifying which pods are managed by this workload.\nPopulated for Deployment, StatefulSet, DaemonSet, and ReplicaSet resources.", + "items": { + "$ref": "#/definitions/KubernetesLabel" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "strategyType": { + "type": "string", + "description": "Rollout strategy type.\n'RollingUpdate' or 'Recreate' for Deployment;\n'RollingUpdate' or 'OnDelete' for StatefulSet and DaemonSet." + }, + "maxUnavailable": { + "type": "string", + "description": "Maximum number of pods that can be unavailable during a rolling update\n(absolute number or percentage string, e.g., '25%').\nPopulated for Deployment and DaemonSet resources." + }, + "maxSurge": { + "type": "string", + "description": "Maximum number of pods that can be created above the desired count during a rolling update\n(absolute number or percentage string, e.g., '25%').\nPopulated for Deployment resources." + }, + "paused": { + "type": "boolean", + "description": "When true, the Deployment rollout is paused. Populated for Deployment resources." + }, + "podManagementPolicy": { + "type": "string", + "description": "Pod creation and deletion ordering policy for a StatefulSet\n('OrderedReady' for sequential or 'Parallel' for simultaneous).\nPopulated for StatefulSet resources." + }, + "volumeClaimTemplates": { + "type": "array", + "description": "PVC templates stamped out per StatefulSet replica to provide stable per-pod storage.\nPopulated for StatefulSet resources.", + "items": { + "$ref": "#/definitions/VolumeClaimTemplate" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "maxUnavailableReplicas": { + "type": "string", + "description": "Maximum number of pods that can be unavailable during a StatefulSet rolling update\n(absolute number or percentage string, e.g., '1', '25%'). Beta as of Kubernetes 1.24.\nPopulated for StatefulSet resources." + }, + "serviceType": { + "type": "string", + "description": "How the service is exposed (e.g., 'ClusterIP', 'NodePort', 'LoadBalancer').\nPopulated for Service resources." + }, + "clusterIp": { + "type": "string", + "description": "Cluster-internal IP assigned to the service. Populated for Service resources." + }, + "servicePorts": { + "type": "array", + "description": "Ports exposed by the Service. Populated for Service resources.", + "items": { + "$ref": "#/definitions/ServicePort" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "serviceSelector": { + "type": "array", + "description": "Label selector routing traffic to pods backing this Service.\nPopulated for Service resources.", + "items": { + "$ref": "#/definitions/KubernetesLabel" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "externalIps": { + "type": "array", + "description": "External IP addresses accepted by cluster nodes for this Service. Populated for Service resources.", + "items": { + "type": "string" + } + }, + "externalName": { + "type": "string", + "description": "DNS CNAME alias target for ExternalName Services. Populated for Service resources." + }, + "externalTrafficPolicy": { + "type": "string", + "description": "Traffic routing policy for externally-facing addresses ('Cluster' or 'Local').\nPopulated for Service resources." + }, + "loadBalancerClass": { + "type": "string", + "description": "Load balancer implementation class identifier. Populated for LoadBalancer Service resources." + }, + "loadBalancerIp": { + "type": "string", + "description": "Static IP address requested from the cloud provider for a LoadBalancer Service.\nDeprecated in Kubernetes 1.24 in favor of spec.loadBalancerIP on the Service.\nPopulated for LoadBalancer Service resources." + }, + "serviceAccountName": { + "type": "string", + "description": "Name of the ServiceAccount the pod runs as.\nPopulated for Pod, Deployment, StatefulSet, and DaemonSet resources." + }, + "tolerations": { + "type": "array", + "description": "Tolerations allowing the pod to be scheduled on nodes with matching taints.\nPopulated for Pod, Deployment, StatefulSet, and DaemonSet resources.", + "items": { + "$ref": "#/definitions/Toleration" + }, + "x-ms-identifiers": [] + }, + "volumes": { + "type": "array", + "description": "Volumes available to containers in the pod or pod template.\nPopulated for Pod, Deployment, StatefulSet, and DaemonSet resources.", + "items": { + "$ref": "#/definitions/Volume" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "dnsPolicy": { + "type": "string", + "description": "DNS policy for the pod (e.g., 'ClusterFirst', 'Default', 'None').\nPopulated for Pod resources." + }, + "securityContext": { + "$ref": "#/definitions/PodSecurityContext", + "description": "Security context applied at the pod level.\nPopulated for Pod, Deployment, StatefulSet, and DaemonSet resources." + }, + "completions": { + "type": "integer", + "format": "int32", + "description": "Total successful pod completions required for the Job to succeed.\nPopulated for Job resources." + }, + "parallelism": { + "type": "integer", + "format": "int32", + "description": "Maximum number of pods running concurrently for a Job.\nPopulated for Job resources." + }, + "backoffLimit": { + "type": "integer", + "format": "int32", + "description": "Number of retries before marking the Job as failed.\nPopulated for Job resources." + }, + "schedule": { + "type": "string", + "description": "Cron schedule expression.\nPopulated for CronJob resources." + }, + "concurrencyPolicy": { + "type": "string", + "description": "Concurrency policy for simultaneous CronJob runs ('Allow', 'Forbid', or 'Replace').\nPopulated for CronJob resources." + }, + "suspend": { + "type": "boolean", + "description": "When true, future executions are suspended.\nPopulated for CronJob and Job resources." + }, + "activeDeadlineSeconds": { + "type": "integer", + "format": "int32", + "description": "Maximum duration in seconds before the Job is terminated regardless of its success.\nPopulated for Job resources." + }, + "completionMode": { + "type": "string", + "description": "Completion tracking mode for Job pods: 'NonIndexed' (default) or 'Indexed'.\nPopulated for Job resources." + }, + "ttlSecondsAfterFinished": { + "type": "integer", + "format": "int32", + "description": "Seconds after Job completion before the Job and its pods are deleted automatically.\nPopulated for Job resources." + }, + "timeZone": { + "type": "string", + "description": "IANA time zone name for CronJob scheduling (e.g., 'America/New_York', 'UTC').\nPopulated for CronJob resources." + }, + "startingDeadlineSeconds": { + "type": "integer", + "format": "int32", + "description": "Deadline in seconds for a CronJob run to start if missed; missed runs are ignored beyond this window.\nPopulated for CronJob resources." + }, + "accessModes": { + "type": "array", + "description": "Storage access modes requested or granted\n(e.g., 'ReadWriteOnce', 'ReadOnlyMany', 'ReadWriteMany').\nPopulated for PersistentVolumeClaim and PersistentVolume resources.", + "items": { + "type": "string" + } + }, + "storageClassName": { + "type": "string", + "description": "Name of the StorageClass for dynamic provisioning or PVC-to-PV binding.\nPopulated for PVC, PV, and StorageClass resources." + }, + "storageRequest": { + "type": "string", + "description": "Storage quantity requested by a PVC (e.g., '10Gi').\nPopulated for PersistentVolumeClaim resources." + }, + "storageCapacity": { + "type": "string", + "description": "Total storage capacity of a PV (e.g., '100Gi').\nPopulated for PersistentVolume resources." + }, + "reclaimPolicy": { + "type": "string", + "description": "Reclaim policy for a PV after its claim is released ('Retain', 'Delete', or 'Recycle').\nPopulated for PersistentVolume and StorageClass resources." + }, + "volumeMode": { + "type": "string", + "description": "Volume mode describing how the volume is used ('Filesystem' or 'Block').\nPopulated for PVC and PV resources." + }, + "boundVolumeName": { + "type": "string", + "description": "For a PVC: the name of the PV it is bound to.\nFor a PV: the name of the PVC bound to it." + }, + "claimRefNamespace": { + "type": "string", + "description": "Namespace of the PVC bound to a PV (populated in PV claimRef).\nPopulated for PersistentVolume resources." + }, + "csiDriver": { + "type": "string", + "description": "CSI driver name managing this PersistentVolume (e.g., 'disk.csi.azure.com').\nPopulated for PersistentVolume resources backed by a CSI driver." + }, + "csiVolumeHandle": { + "type": "string", + "description": "Unique volume handle assigned by the CSI driver.\nPopulated for PersistentVolume resources backed by a CSI driver." + }, + "provisioner": { + "type": "string", + "description": "CSI driver (provisioner) name for a StorageClass (e.g., 'disk.csi.azure.com').\nPopulated for StorageClass resources." + }, + "volumeBindingMode": { + "type": "string", + "description": "When to bind a PV to a PVC: 'Immediate' binds on creation;\n'WaitForFirstConsumer' delays until a pod claims the PVC.\nPopulated for StorageClass resources." + }, + "allowVolumeExpansion": { + "type": "boolean", + "description": "When true, PVCs using this StorageClass may be expanded after provisioning.\nPopulated for StorageClass resources." + }, + "secretType": { + "type": "string", + "description": "Kubernetes Secret type (e.g., 'Opaque', 'kubernetes.io/tls', 'kubernetes.io/service-account-token').\nPopulated for Secret resources." + }, + "configMapData": { + "type": "array", + "description": "Key-value pairs stored in the ConfigMap (e.g., configuration files, environment values).\nEach entry maps a string key to a string value.\nPopulated for ConfigMap resources.", + "items": { + "$ref": "#/definitions/KubernetesLabel" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "configMapBinaryDataKeys": { + "type": "array", + "description": "Keys present in the ConfigMap binaryData field.\nBinary values are not captured; only key names are stored for reference.\nPopulated for ConfigMap resources.", + "items": { + "type": "string" + } + }, + "configMapImmutable": { + "type": "boolean", + "description": "When true, the ConfigMap is immutable and cannot be updated after creation.\nPopulated for ConfigMap resources." + }, + "automountServiceAccountToken": { + "type": "boolean", + "description": "When false, prevents the default Kubernetes service account token from being\nauto-mounted into pods running as this ServiceAccount.\nPopulated for ServiceAccount resources." + }, + "attacherName": { + "type": "string", + "description": "Name of the CSI driver that should attach/detach the volume (e.g., 'disk.csi.azure.com').\nPopulated for VolumeAttachment resources." + }, + "attachedVolumeName": { + "type": "string", + "description": "Name of the PersistentVolume being attached.\nPopulated for VolumeAttachment resources." + }, + "ingressClassName": { + "type": "string", + "description": "Name of the IngressClass that governs this Ingress resource.\nPopulated for Ingress resources." + }, + "ingressRules": { + "type": "array", + "description": "Routing rules mapping hostnames and URL paths to backend Services.\nPopulated for Ingress resources.", + "items": { + "$ref": "#/definitions/IngressRule" + }, + "x-ms-identifiers": [] + }, + "ingressTls": { + "type": "array", + "description": "TLS termination configuration for Ingress resources.\nPopulated for Ingress resources.", + "items": { + "$ref": "#/definitions/IngressTls" + }, + "x-ms-identifiers": [] + }, + "defaultBackendServiceName": { + "type": "string", + "description": "Backend Service name to route traffic when no rule matches.\nPopulated for Ingress resources." + }, + "defaultBackendServicePort": { + "type": "string", + "description": "Backend Service port to route traffic when no rule matches (number or named port).\nPopulated for Ingress resources." + }, + "ingressController": { + "type": "string", + "description": "Controller class reference for an IngressClass (e.g., 'nginx.ingress.kubernetes.io/controller').\nPopulated for IngressClass resources." + }, + "podSelectorLabels": { + "type": "array", + "description": "Label selector identifying the pods this NetworkPolicy applies to.\nPopulated for NetworkPolicy resources.", + "items": { + "$ref": "#/definitions/KubernetesLabel" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "networkPolicyTypes": { + "type": "array", + "description": "Policy directions enforced ('Ingress', 'Egress', or both).\nPopulated for NetworkPolicy resources.", + "items": { + "type": "string" + } + }, + "rbacRules": { + "type": "array", + "description": "RBAC permission rules granting access to Kubernetes API resources.\nPopulated for Role and ClusterRole resources.", + "items": { + "$ref": "#/definitions/PolicyRule" + }, + "x-ms-identifiers": [] + }, + "rbacSubjects": { + "type": "array", + "description": "Subjects (users, groups, service accounts) granted permissions by this binding.\nPopulated for RoleBinding and ClusterRoleBinding resources.", + "items": { + "$ref": "#/definitions/RbacSubject" + }, + "x-ms-identifiers": [] + }, + "rbacRoleRefKind": { + "type": "string", + "description": "Kind of the role referenced by a binding ('Role' or 'ClusterRole').\nPopulated for RoleBinding and ClusterRoleBinding resources." + }, + "rbacRoleRefName": { + "type": "string", + "description": "Name of the role referenced by a binding.\nPopulated for RoleBinding and ClusterRoleBinding resources." + }, + "scaleTargetRefKind": { + "type": "string", + "description": "Kind of the resource being autoscaled (e.g., 'Deployment', 'StatefulSet').\nPopulated for HorizontalPodAutoscaler resources." + }, + "scaleTargetRefName": { + "type": "string", + "description": "Name of the resource being autoscaled.\nPopulated for HorizontalPodAutoscaler resources." + }, + "minReplicas": { + "type": "integer", + "format": "int32", + "description": "Minimum replica count for autoscaling.\nPopulated for HorizontalPodAutoscaler resources." + }, + "maxReplicas": { + "type": "integer", + "format": "int32", + "description": "Maximum replica count for autoscaling.\nPopulated for HorizontalPodAutoscaler resources." + }, + "minAvailable": { + "type": "string", + "description": "Minimum number of pods that must remain available during voluntary disruptions\n(absolute number or percentage string, e.g., '2', '50%').\nPopulated for PodDisruptionBudget resources." + }, + "maxUnavailablePods": { + "type": "string", + "description": "Maximum number of pods that may be simultaneously unavailable during voluntary disruptions.\nPopulated for PodDisruptionBudget resources." + }, + "priorityValue": { + "type": "integer", + "format": "int32", + "description": "Numeric scheduling priority value for a PriorityClass.\nPopulated for PriorityClass resources." + }, + "globalDefault": { + "type": "boolean", + "description": "When true, this PriorityClass is the cluster default for pods without an explicit priorityClassName.\nPopulated for PriorityClass resources." + }, + "preemptionPolicy": { + "type": "string", + "description": "Preemption policy for pods with this priority class when system resources are scarce\n('PreemptLowerPriority' or 'Never').\nPopulated for PriorityClass resources." + }, + "taints": { + "type": "array", + "description": "Taints applied to the node, repelling pods that lack a matching toleration.\nPopulated for Node resources.", + "items": { + "$ref": "#/definitions/NodeTaint" + }, + "x-ms-identifiers": [] + }, + "unschedulable": { + "type": "boolean", + "description": "When true, the node is cordoned and will not accept new pod scheduling.\nPopulated for Node resources." + }, + "providerId": { + "type": "string", + "description": "Cloud provider identifier for the node\n(e.g., 'azure:///subscriptions/.../virtualMachines/vm-0').\nPopulated for Node resources." + }, + "podCidr": { + "type": "string", + "description": "IP range assigned to pods running on this node.\nPopulated for Node resources." + }, + "endpointSliceAddressType": { + "type": "string", + "description": "Address family for all endpoints in this EndpointSlice ('IPv4', 'IPv6', or 'FQDN').\nPopulated for EndpointSlice resources." + }, + "endpointSliceEndpoints": { + "type": "array", + "description": "Endpoints contained in this EndpointSlice.\nPopulated for EndpointSlice resources.", + "items": { + "$ref": "#/definitions/EndpointSliceEndpoint" + }, + "x-ms-identifiers": [] + }, + "endpointSlicePorts": { + "type": "array", + "description": "Ports exposed by the endpoints in this EndpointSlice.\nPopulated for EndpointSlice resources.", + "items": { + "$ref": "#/definitions/EndpointSlicePort" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "csrSignerName": { + "type": "string", + "description": "Name of the signer that will sign the certificate (e.g., 'kubernetes.io/kube-apiserver-client').\nPopulated for CertificateSigningRequest resources." + }, + "csrUsername": { + "type": "string", + "description": "Name of the user that created the CertificateSigningRequest.\nPopulated for CertificateSigningRequest resources." + }, + "csrUsages": { + "type": "array", + "description": "Key usages requested for the certificate (e.g., 'client auth', 'server auth', 'digital signature').\nPopulated for CertificateSigningRequest resources.", + "items": { + "type": "string" + } + }, + "csrExpirationSeconds": { + "type": "integer", + "format": "int32", + "description": "Requested duration in seconds for the issued certificate.\nPopulated for CertificateSigningRequest resources." + }, + "storageCapacityAvailable": { + "type": "string", + "description": "Available storage capacity for the StorageClass in this topology segment (e.g., '500Gi').\nPopulated for CSIStorageCapacity resources." + }, + "maximumVolumeSize": { + "type": "string", + "description": "Maximum size of a single volume that can be created in this topology segment.\nPopulated for CSIStorageCapacity resources." + }, + "admissionPolicyFailurePolicy": { + "type": "string", + "description": "What happens when a policy evaluation fails: 'Fail' rejects the request; 'Ignore' allows it.\nPopulated for ValidatingAdmissionPolicy resources." + }, + "admissionPolicyMatchConstraints": { + "type": "array", + "description": "API resource rules that trigger this ValidatingAdmissionPolicy\n(e.g., 'CREATE pods', 'UPDATE deployments').\nEach entry is a human-readable summary of a resource rule.\nPopulated for ValidatingAdmissionPolicy resources.", + "items": { + "type": "string" + } + }, + "admissionPolicyBindingPolicyName": { + "type": "string", + "description": "Name of the ValidatingAdmissionPolicy this binding applies.\nPopulated for ValidatingAdmissionPolicyBinding resources." + }, + "admissionPolicyValidationActions": { + "type": "array", + "description": "How validation failures are enforced: 'Deny', 'Warn', or 'Audit'.\nPopulated for ValidatingAdmissionPolicyBinding resources.", + "items": { + "type": "string" + } + }, + "additionalFields": { + "type": "array", + "description": "Additional resource-specific fields not represented by the typed properties above.\nUsed for uncommon fields and custom resource definition instances.", + "items": { + "$ref": "#/definitions/KubernetesGenericField" + }, + "x-ms-identifiers": [ + "name" + ] + } + } + }, + "KubernetesResourceStatus": { + "type": "object", + "description": "Observed state (status) of a Kubernetes resource, written by the controller.\n\nWell-known fields for native workloads (Pod, Deployment, Service, etc.) are typed\ndirectly. Fields not covered by any typed property can be placed in additionalFields.", + "properties": { + "conditions": { + "type": "array", + "description": "Conditions reported by the controller managing this resource.", + "items": { + "$ref": "#/definitions/KubernetesCondition" + }, + "x-ms-identifiers": [ + "type" + ] + }, + "phase": { + "type": "string", + "description": "High-level lifecycle phase of the resource.\nExamples: 'Running' / 'Pending' / 'Succeeded' / 'Failed' for Pod;\n'Bound' / 'Pending' / 'Lost' for PersistentVolumeClaim;\n'Active' / 'Terminating' for Namespace." + }, + "message": { + "type": "string", + "description": "Human-readable message summarizing the resource state." + }, + "replicas": { + "type": "integer", + "format": "int32", + "description": "Total non-terminating pods targeted by this workload. Populated for Deployment, StatefulSet, ReplicaSet." + }, + "readyReplicas": { + "type": "integer", + "format": "int32", + "description": "Number of pods ready to serve requests. Populated for Deployment, StatefulSet, DaemonSet." + }, + "availableReplicas": { + "type": "integer", + "format": "int32", + "description": "Number of pods available for at least minReadySeconds. Populated for Deployment, DaemonSet, StatefulSet." + }, + "updatedReplicas": { + "type": "integer", + "format": "int32", + "description": "Pods running the current (desired) template spec. Populated for Deployment, StatefulSet, DaemonSet." + }, + "unavailableReplicas": { + "type": "integer", + "format": "int32", + "description": "Pods required but not yet available. Populated for Deployment resources." + }, + "currentReplicas": { + "type": "integer", + "format": "int32", + "description": "Pods running the previous revision (before update completes).\nPopulated for StatefulSet resources." + }, + "currentRevision": { + "type": "string", + "description": "Name of the StatefulSet revision corresponding to currentReplicas.\nPopulated for StatefulSet resources." + }, + "updateRevision": { + "type": "string", + "description": "Name of the StatefulSet revision applied to updatedReplicas.\nPopulated for StatefulSet resources." + }, + "desiredReplicas": { + "type": "integer", + "format": "int32", + "description": "Desired replica count calculated by the HorizontalPodAutoscaler.\nPopulated for HorizontalPodAutoscaler resources." + }, + "terminatingReplicas": { + "type": "integer", + "format": "int32", + "description": "Pods that are terminating but not yet removed from the endpoints.\nPopulated for Deployment and ReplicaSet resources." + }, + "desiredNumberScheduled": { + "type": "integer", + "format": "int32", + "description": "Total nodes that should run the daemon pod. Populated for DaemonSet resources." + }, + "currentNumberScheduled": { + "type": "integer", + "format": "int32", + "description": "Nodes running at least one daemon pod. Populated for DaemonSet resources." + }, + "numberReady": { + "type": "integer", + "format": "int32", + "description": "Nodes with a Ready daemon pod. Populated for DaemonSet resources." + }, + "numberMisscheduled": { + "type": "integer", + "format": "int32", + "description": "Nodes running the daemon pod that should not be running it.\nPopulated for DaemonSet resources." + }, + "numberUnavailable": { + "type": "integer", + "format": "int32", + "description": "Nodes missing an available daemon pod. Populated for DaemonSet resources." + }, + "podIp": { + "type": "string", + "description": "IP address allocated to the pod within the cluster. Populated for Pod resources." + }, + "podIps": { + "type": "array", + "description": "Additional pod IPs assigned in multi-network or dual-stack clusters. Populated for Pod resources.", + "items": { + "type": "string" + } + }, + "hostIp": { + "type": "string", + "description": "IP address of the node hosting the pod. Populated for Pod resources." + }, + "hostIps": { + "type": "array", + "description": "Additional host IPs for dual-stack nodes. Populated for Pod resources.", + "items": { + "type": "string" + } + }, + "startTime": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp when the pod was accepted by the scheduler. Populated for Pod resources." + }, + "containerStatuses": { + "type": "array", + "description": "Runtime status of each container in the pod.\nPopulated for Pod resources.", + "items": { + "$ref": "#/definitions/ContainerStatus" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "initContainerStatuses": { + "type": "array", + "description": "Runtime status of each init container in the pod.\nPopulated for Pod resources.", + "items": { + "$ref": "#/definitions/ContainerStatus" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "qosClass": { + "type": "string", + "description": "QoS class assigned by Kubernetes based on resource requests and limits.\nOne of 'Guaranteed', 'Burstable', or 'BestEffort'. Populated for Pod resources." + }, + "reason": { + "type": "string", + "description": "Brief CamelCase reason for the pod's current state (e.g., 'Evicted', 'OOMKilled').\nPopulated for Pod resources." + }, + "observedGeneration": { + "type": "integer", + "format": "int64", + "description": "Most recent generation observed by the controller.\nPopulated for Deployment, StatefulSet, DaemonSet, and Pod resources." + }, + "activeJobCount": { + "type": "integer", + "format": "int32", + "description": "Number of currently active (running or pending) pods. Populated for Job resources." + }, + "succeededJobCount": { + "type": "integer", + "format": "int32", + "description": "Number of pods that completed successfully. Populated for Job resources." + }, + "failedJobCount": { + "type": "integer", + "format": "int32", + "description": "Number of pods that failed. Populated for Job resources." + }, + "readyPods": { + "type": "integer", + "format": "int32", + "description": "Number of pods in ready state for a Job. Populated for Job resources." + }, + "jobStartTime": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp when the Job started executing. Populated for Job resources." + }, + "jobCompletionTime": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp when the Job completed successfully. Populated for Job resources." + }, + "lastScheduleTime": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp when the CronJob last successfully scheduled a Job." + }, + "lastSuccessfulTime": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp when the last Job triggered by this CronJob completed successfully." + }, + "loadBalancerIngress": { + "type": "array", + "description": "External IP addresses or hostnames assigned to LoadBalancer Services or Ingress resources.\nPopulated for Service (type LoadBalancer) and Ingress resources.", + "items": { + "type": "string" + } + }, + "lastScaleTime": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp of the most recent scaling event triggered by the HPA.\nPopulated for HorizontalPodAutoscaler resources." + }, + "nodeAddresses": { + "type": "array", + "description": "Network addresses of the node (InternalIP, ExternalIP, Hostname).\nPopulated for Node resources.", + "items": { + "$ref": "#/definitions/NodeAddress" + }, + "x-ms-identifiers": [ + "address" + ] + }, + "nodeInfo": { + "$ref": "#/definitions/NodeSystemInfo", + "description": "Operating system and runtime information for the node.\nPopulated for Node resources." + }, + "nodeCapacity": { + "$ref": "#/definitions/NodeResourceMap", + "description": "Total hardware resources of the node (cpu, memory, pods, ephemeral-storage).\nPopulated for Node resources." + }, + "nodeAllocatable": { + "$ref": "#/definitions/NodeResourceMap", + "description": "Resources available for scheduling after system reservation.\nPopulated for Node resources." + }, + "volumesAttached": { + "type": "array", + "description": "Volumes that have been successfully attached to the node by the attach/detach controller.\nPopulated for Node resources.", + "items": { + "$ref": "#/definitions/AttachedVolume" + }, + "x-ms-identifiers": [ + "name" + ] + }, + "currentHealthy": { + "type": "integer", + "format": "int32", + "description": "Currently healthy (Ready) pods counted by the PodDisruptionBudget." + }, + "desiredHealthy": { + "type": "integer", + "format": "int32", + "description": "Minimum healthy pods required by the PodDisruptionBudget." + }, + "disruptionsAllowed": { + "type": "integer", + "format": "int32", + "description": "Number of pod disruptions currently allowed by the PodDisruptionBudget." + }, + "expectedPods": { + "type": "integer", + "format": "int32", + "description": "Total number of pods counted by the PodDisruptionBudget (ready + not ready)." + }, + "pvcCapacity": { + "type": "string", + "description": "Actual provisioned storage capacity for the PVC after binding (e.g., '10Gi').\nPopulated for PersistentVolumeClaim resources." + }, + "pvcAccessModes": { + "type": "array", + "description": "Access modes granted to the PVC after it is bound to a PV.\nPopulated for PersistentVolumeClaim resources.", + "items": { + "type": "string" + } + }, + "volumeAttached": { + "type": "boolean", + "description": "When true, the volume is successfully attached to the target node.\nPopulated for VolumeAttachment resources." + }, + "additionalFields": { + "type": "array", + "description": "Additional resource-specific status fields not represented by the typed properties above.\nUsed for uncommon fields and custom resource definition instances.", + "items": { + "$ref": "#/definitions/KubernetesGenericField" + }, + "x-ms-identifiers": [ + "name" + ] + } + } + }, + "NetworkProtocol": { + "type": "string", + "description": "Network protocol used by a container port.", + "enum": [ + "TCP", + "UDP", + "SCTP" + ], + "x-ms-enum": { + "name": "NetworkProtocol", + "modelAsString": true, + "values": [ + { + "name": "TCP", + "value": "TCP", + "description": "Transmission Control Protocol." + }, + { + "name": "UDP", + "value": "UDP", + "description": "User Datagram Protocol." + }, + { + "name": "SCTP", + "value": "SCTP", + "description": "Stream Control Transmission Protocol." + } + ] + } + }, + "NodeAddress": { + "type": "object", + "description": "A network address associated with a Kubernetes Node.", + "properties": { + "type": { + "type": "string", + "description": "Address type (e.g., 'InternalIP', 'ExternalIP', 'Hostname')." + }, + "address": { + "type": "string", + "description": "The address value (IP address or hostname)." + } + }, + "required": [ + "address" + ] + }, + "NodeResourceMap": { + "type": "object", + "description": "Resource quantities reported for a Kubernetes Node (capacity or allocatable).", + "properties": { + "cpu": { + "type": "string", + "description": "CPU quantity (e.g., '4', '3850m')." + }, + "memory": { + "type": "string", + "description": "Memory quantity (e.g., '16Gi', '14902Mi')." + }, + "pods": { + "type": "string", + "description": "Maximum number of pods the node supports." + }, + "ephemeralStorage": { + "type": "string", + "description": "Ephemeral storage quantity (e.g., '119Gi')." + } + } + }, + "NodeSystemInfo": { + "type": "object", + "description": "Operating system and runtime information reported by the kubelet for a Node.", + "properties": { + "kernelVersion": { + "type": "string", + "description": "Kernel version of the node OS (e.g., '5.15.0-1041-azure')." + }, + "osImage": { + "type": "string", + "description": "Human-readable OS image string (e.g., 'Ubuntu 22.04.3 LTS')." + }, + "containerRuntimeVersion": { + "type": "string", + "description": "Container runtime name and version (e.g., 'containerd://1.7.2')." + }, + "kubeletVersion": { + "type": "string", + "description": "Kubelet binary version running on the node (e.g., 'v1.29.2')." + }, + "kubeProxyVersion": { + "type": "string", + "description": "kube-proxy version running on the node." + }, + "architecture": { + "type": "string", + "description": "CPU architecture of the node (e.g., 'amd64', 'arm64')." + }, + "operatingSystem": { + "type": "string", + "description": "Operating system family ('linux' or 'windows')." + } + } + }, + "NodeTaint": { + "type": "object", + "description": "A taint applied to a Kubernetes Node that repels pods without a matching toleration.", + "properties": { + "key": { + "type": "string", + "description": "Taint key (e.g., 'node.kubernetes.io/not-ready')." + }, + "value": { + "type": "string", + "description": "Taint value matched by tolerations using the 'Equal' operator." + }, + "effect": { + "$ref": "#/definitions/NodeTaintEffect", + "description": "Effect applied to non-tolerating pods." + } + }, + "required": [ + "key" + ] + }, + "NodeTaintEffect": { + "type": "string", + "description": "Effect applied to pods that do not tolerate a node taint.", + "enum": [ + "NoSchedule", + "PreferNoSchedule", + "NoExecute" + ], + "x-ms-enum": { + "name": "NodeTaintEffect", + "modelAsString": true, + "values": [ + { + "name": "NoSchedule", + "value": "NoSchedule", + "description": "New pods will not be scheduled on the tainted node." + }, + { + "name": "PreferNoSchedule", + "value": "PreferNoSchedule", + "description": "The scheduler tries to avoid placing new pods on the tainted node." + }, + { + "name": "NoExecute", + "value": "NoExecute", + "description": "Existing pods without a matching toleration are evicted from the tainted node." + } + ] + } + }, + "OwnerReference": { + "type": "object", + "description": "A reference from a Kubernetes object to its owner (e.g., a ReplicaSet owning a Pod).", + "properties": { + "apiVersion": { + "type": "string", + "description": "API version of the owner (e.g., 'apps/v1')." + }, + "kind": { + "type": "string", + "description": "Kind of the owner (e.g., 'ReplicaSet')." + }, + "name": { + "type": "string", + "description": "Name of the owner object." + }, + "uid": { + "type": "string", + "description": "UID of the owner object.", + "readOnly": true + }, + "controller": { + "type": "boolean", + "description": "True when this owner manages the lifecycle of the referencing object." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, deletion of the owner is blocked until this reference is removed." + } + }, + "required": [ + "uid" + ] + }, + "PodSecurityContext": { + "type": "object", + "description": "Security context applied at the pod level, affecting all containers.", + "properties": { + "fsGroup": { + "type": "integer", + "format": "int64", + "description": "GID of the owning group for volume mounts; processes also run as this GID." + }, + "runAsUser": { + "type": "integer", + "format": "int64", + "description": "UID to run all containers as. Overridden per-container by ContainerSecurityContext.runAsUser." + }, + "runAsGroup": { + "type": "integer", + "format": "int64", + "description": "GID to run all containers as." + }, + "runAsNonRoot": { + "type": "boolean", + "description": "Require all containers to run as non-root when true." + }, + "supplementalGroups": { + "type": "array", + "description": "Supplemental GIDs applied to each container in addition to the primary GID.", + "items": { + "type": "integer", + "format": "int64" + } + }, + "seccompProfile": { + "type": "string", + "description": "Seccomp profile type applied to all containers ('RuntimeDefault', 'Unconfined', or 'Localhost')." + }, + "appArmorProfile": { + "type": "string", + "description": "AppArmor profile type applied to all containers ('RuntimeDefault', 'Unconfined', or 'Localhost')." + } + } + }, + "PolicyRule": { + "type": "object", + "description": "A single RBAC permission rule granting verbs on Kubernetes API resources.", + "properties": { + "apiGroups": { + "type": "array", + "description": "API groups the rule applies to (use '' for the core group).", + "items": { + "type": "string" + } + }, + "resources": { + "type": "array", + "description": "Resource types the rule applies to (e.g., 'pods', 'deployments', 'secrets').", + "items": { + "type": "string" + } + }, + "verbs": { + "type": "array", + "description": "Actions permitted (e.g., 'get', 'list', 'watch', 'create', 'update', 'patch', 'delete').", + "items": { + "type": "string" + } + }, + "resourceNames": { + "type": "array", + "description": "Specific resource names this rule applies to. Empty means all instances.", + "items": { + "type": "string" + } + } + }, + "required": [ + "verbs" + ] + }, + "RbacSubject": { + "type": "object", + "description": "A subject (user, group, or service account) in a RoleBinding or ClusterRoleBinding.", + "properties": { + "kind": { + "type": "string", + "description": "Kind of the subject: 'User', 'Group', or 'ServiceAccount'." + }, + "name": { + "type": "string", + "description": "Name of the subject." + }, + "namespaceName": { + "type": "string", + "description": "Namespace of the ServiceAccount. Required when kind is ServiceAccount." + } + }, + "required": [ + "name" + ] + }, + "ServicePort": { + "type": "object", + "description": "A port exposed by a Kubernetes Service.", + "properties": { + "port": { + "type": "integer", + "format": "int32", + "description": "Port number the Service listens on (cluster-internal)." + }, + "targetPort": { + "type": "string", + "description": "Port or named port on the target pod the traffic is forwarded to." + }, + "nodePort": { + "type": "integer", + "format": "int32", + "description": "NodePort allocated for NodePort and LoadBalancer Services." + }, + "protocol": { + "$ref": "#/definitions/NetworkProtocol", + "description": "Network protocol for this port." + }, + "name": { + "type": "string", + "description": "Optional name for this port, unique within the Service." + }, + "appProtocol": { + "type": "string", + "description": "Application-level protocol hint (e.g., 'http', 'https', 'grpc')." + } + }, + "required": [ + "port" + ] + }, + "Toleration": { + "type": "object", + "description": "A toleration allows a pod to be scheduled on a node with a matching taint.", + "properties": { + "key": { + "type": "string", + "description": "Taint key the toleration applies to. Empty matches all keys.", + "readOnly": true + }, + "operator": { + "type": "string", + "description": "Operator to use when matching: 'Equal' matches when key and value both match;\n'Exists' matches when the key is present regardless of value." + }, + "value": { + "type": "string", + "description": "Taint value matched when operator is 'Equal'." + }, + "effect": { + "type": "string", + "description": "Taint effect this toleration applies to\n('NoSchedule', 'PreferNoSchedule', or 'NoExecute'). Empty matches all effects." + }, + "tolerationSeconds": { + "type": "integer", + "format": "int64", + "description": "Seconds a pod tolerates a NoExecute taint before being evicted." + } + }, + "required": [ + "key" + ] + }, + "Volume": { + "type": "object", + "description": "A volume available to containers in a pod.\nThe sourceType field identifies the kind of volume source\n(e.g., 'emptyDir', 'configMap', 'secret', 'persistentVolumeClaim', 'projected').", + "properties": { + "name": { + "type": "string", + "description": "Name of the volume, referenced by container volumeMounts." + }, + "sourceType": { + "type": "string", + "description": "Kind of volume source\n(e.g., 'emptyDir', 'configMap', 'secret', 'persistentVolumeClaim', 'projected')." + }, + "source": { + "type": "string", + "description": "Primary reference for the volume source (e.g., ConfigMap name or PVC name)." + }, + "sizeLimit": { + "type": "string", + "description": "Storage size limit for emptyDir volumes (e.g., '50Mi')." + } + }, + "required": [ + "name" + ] + }, + "VolumeClaimTemplate": { + "type": "object", + "description": "A PersistentVolumeClaim template in a StatefulSet that provisions stable storage per replica.", + "properties": { + "name": { + "type": "string", + "description": "Name of the volume claim template, referenced by container volumeMounts." + }, + "accessModes": { + "type": "array", + "description": "Requested storage access modes (e.g., 'ReadWriteOnce').", + "items": { + "type": "string" + } + }, + "storageClassName": { + "type": "string", + "description": "StorageClass used for dynamic provisioning." + }, + "storageRequest": { + "type": "string", + "description": "Storage quantity requested per replica (e.g., '10Gi')." + }, + "volumeMode": { + "type": "string", + "description": "Volume mode ('Filesystem' or 'Block')." + } + }, + "required": [ + "name" + ] + }, + "VolumeMount": { + "type": "object", + "description": "A volume mount inside a container.", + "properties": { + "name": { + "type": "string", + "description": "Name matching a volume declared in the pod spec." + }, + "mountPath": { + "type": "string", + "description": "Absolute path inside the container where the volume is mounted." + }, + "readOnly": { + "type": "boolean", + "description": "Mount the volume as read-only when true." + }, + "subPath": { + "type": "string", + "description": "Sub-path within the volume to mount instead of the volume root." + } + }, + "required": [ + "name" + ] + } + }, + "parameters": {} +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-CSIStorageCapacity.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-CSIStorageCapacity.json new file mode 100644 index 000000000000..b300a84a4d69 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-CSIStorageCapacity.json @@ -0,0 +1,64 @@ +{ + "title": "Get KubernetesResources - CSIStorageCapacity", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "csistoragecapacity-managed-premium-pool1-kube-system", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/csistoragecapacity-managed-premium-pool1-kube-system", + "name": "csistoragecapacity-managed-premium-pool1-kube-system", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "storage.k8s.io/v1", + "kind": "CSIStorageCapacity", + "metadata": { + "name": "managed-premium-pool1", + "namespaceName": "kube-system", + "uid": "a7b8c9d0-e1f2-3456-abcd-789012345678", + "resourceVersion": "4567890", + "generation": 1, + "creationTimestamp": "2026-04-01T06:00:00Z", + "labels": [ + { + "name": "csi.storage.k8s.io/storageclass", + "value": "managed-premium" + } + ] + }, + "spec": { + "storageClassName": "managed-premium", + "storageCapacityAvailable": "512Gi", + "maximumVolumeSize": "4Ti", + "additionalFields": [ + { + "name": "nodeTopology.matchLabels.topology.kubernetes.io/zone", + "value": "eastus-1" + }, + { + "name": "nodeTopology.matchLabels.kubernetes.io/hostname", + "value": "aks-nodepool1-12345678-vmss000000" + } + ] + }, + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-CertificateSigningRequest.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-CertificateSigningRequest.json new file mode 100644 index 000000000000..8d22cc009631 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-CertificateSigningRequest.json @@ -0,0 +1,78 @@ +{ + "title": "Get KubernetesResources - CertificateSigningRequest", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "certificatesigningrequest-myapp-node-client", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/certificatesigningrequest-myapp-node-client", + "name": "certificatesigningrequest-myapp-node-client", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "certificates.k8s.io/v1", + "kind": "CertificateSigningRequest", + "metadata": { + "name": "myapp-node-client", + "uid": "f6a7b8c9-d0e1-2345-fabc-678901234567", + "resourceVersion": "3456789", + "generation": 1, + "creationTimestamp": "2026-05-20T09:30:00Z", + "labels": [ + { + "name": "app", + "value": "myapp" + } + ] + }, + "spec": { + "csrSignerName": "kubernetes.io/kube-apiserver-client", + "csrUsername": "system:serviceaccount:default:myapp-sa", + "csrUsages": [ + "client auth", + "digital signature", + "key encipherment" + ], + "csrExpirationSeconds": 86400 + }, + "status": { + "conditions": [ + { + "type": "Approved", + "status": "True", + "reason": "KubectlApprove", + "message": "This CSR was approved by kubectl certificate approve.", + "lastTransitionTime": "2026-05-20T09:31:00Z" + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "CertificateIssued", + "age": "16d", + "from": "certificatesigningrequest-controller", + "message": "Signed certificate from signer kubernetes.io/kube-apiserver-client" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ConfigMap.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ConfigMap.json new file mode 100644 index 000000000000..654cb8053d11 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ConfigMap.json @@ -0,0 +1,84 @@ +{ + "title": "Get KubernetesResources - ConfigMap", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "configmap-app-config-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/configmap-app-config-default", + "name": "configmap-app-config-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "app-config", + "namespaceName": "default", + "uid": "d4e5f6a7-b8c9-0123-defa-456789012345", + "resourceVersion": "1234567", + "generation": 1, + "creationTimestamp": "2026-05-01T12:00:00Z", + "labels": [ + { + "name": "app", + "value": "myapp" + }, + { + "name": "environment", + "value": "production" + } + ], + "annotations": [ + { + "name": "kubectl.kubernetes.io/last-applied-configuration", + "value": "{}" + } + ] + }, + "spec": { + "configMapData": [ + { + "name": "DATABASE_HOST", + "value": "postgres.default.svc.cluster.local" + }, + { + "name": "DATABASE_PORT", + "value": "5432" + }, + { + "name": "LOG_LEVEL", + "value": "info" + }, + { + "name": "FEATURE_FLAGS", + "value": "feature-a=true,feature-b=false" + } + ], + "configMapBinaryDataKeys": [ + "tls.crt", + "tls.key" + ], + "configMapImmutable": false + }, + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-CronJob.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-CronJob.json new file mode 100644 index 000000000000..ac9c83335905 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-CronJob.json @@ -0,0 +1,99 @@ +{ + "title": "Get KubernetesResources - CronJob", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "cronjob-report-generator-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/cronjob-report-generator-default", + "name": "cronjob-report-generator-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "batch/v1", + "kind": "CronJob", + "metadata": { + "name": "report-generator", + "namespaceName": "default", + "uid": "c9d0e1f2-a3b4-5678-cdef-890123456789", + "resourceVersion": "8901234", + "generation": 3, + "creationTimestamp": "2026-01-05T00:00:00Z", + "labels": [ + { + "name": "app", + "value": "report-generator" + } + ] + }, + "spec": { + "schedule": "0 2 * * *", + "concurrencyPolicy": "Forbid", + "suspend": false, + "timeZone": "America/New_York", + "startingDeadlineSeconds": 60, + "completions": 1, + "parallelism": 1, + "backoffLimit": 2, + "containers": [ + { + "name": "reporter", + "image": "myapp/reporter:latest", + "imagePullPolicy": "Always", + "envFrom": [ + { + "configMapRef": "report-config" + }, + { + "secretRef": "report-credentials" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + }, + "limits": { + "cpu": "1000m", + "memory": "1Gi" + } + } + } + ] + }, + "status": { + "lastScheduleTime": "2026-06-04T02:00:00Z", + "lastSuccessfulTime": "2026-06-04T02:03:45Z", + "activeJobCount": 0, + "conditions": [] + }, + "events": [ + { + "type": "Normal", + "reason": "SuccessfulCreate", + "age": "1d", + "from": "cronjob-controller", + "message": "Created job report-generator-28651200" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-DaemonSet.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-DaemonSet.json new file mode 100644 index 000000000000..519568082224 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-DaemonSet.json @@ -0,0 +1,157 @@ +{ + "title": "Get KubernetesResources - DaemonSet", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "daemonset-kube-proxy-kube-system", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/daemonset-kube-proxy-kube-system", + "name": "daemonset-kube-proxy-kube-system", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "apps/v1", + "kind": "DaemonSet", + "metadata": { + "name": "kube-proxy", + "namespaceName": "kube-system", + "uid": "a1b2c3d4-e5f6-7890-bcde-f01234567890", + "resourceVersion": "12345", + "generation": 1, + "creationTimestamp": "2026-01-01T00:00:00Z", + "labels": [ + { + "name": "k8s-app", + "value": "kube-proxy" + }, + { + "name": "component", + "value": "kube-proxy" + } + ] + }, + "spec": { + "selector": [ + { + "name": "k8s-app", + "value": "kube-proxy" + } + ], + "strategyType": "RollingUpdate", + "maxUnavailable": "1", + "serviceAccountName": "kube-proxy", + "tolerations": [ + { + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "effect": "NoSchedule" + }, + { + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "effect": "NoSchedule" + }, + { + "key": "node.kubernetes.io/disk-pressure", + "operator": "Exists", + "effect": "NoSchedule" + }, + { + "key": "node.kubernetes.io/memory-pressure", + "operator": "Exists", + "effect": "NoSchedule" + }, + { + "key": "node.kubernetes.io/unschedulable", + "operator": "Exists", + "effect": "NoSchedule" + } + ], + "volumes": [ + { + "name": "kube-proxy", + "sourceType": "configMap", + "source": "kube-proxy" + }, + { + "name": "xtables-lock", + "sourceType": "hostPath", + "source": "/run/xtables.lock" + }, + { + "name": "lib-modules", + "sourceType": "hostPath", + "source": "/lib/modules" + } + ], + "containers": [ + { + "name": "kube-proxy", + "image": "registry.k8s.io/kube-proxy:v1.29.0", + "imagePullPolicy": "IfNotPresent", + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + } + }, + "volumeMounts": [ + { + "name": "kube-proxy", + "mountPath": "/var/lib/kube-proxy" + }, + { + "name": "xtables-lock", + "mountPath": "/run/xtables.lock" + }, + { + "name": "lib-modules", + "mountPath": "/lib/modules", + "readOnly": true + } + ], + "securityContext": { + "privileged": true + } + } + ] + }, + "status": { + "desiredNumberScheduled": 3, + "currentNumberScheduled": 3, + "numberReady": 3, + "numberMisscheduled": 0, + "numberUnavailable": 0, + "availableReplicas": 3, + "updatedReplicas": 3, + "observedGeneration": 1, + "conditions": [ + { + "type": "Available", + "status": "True", + "lastTransitionTime": "2026-01-01T00:02:00Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Deployment.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Deployment.json new file mode 100644 index 000000000000..a5e4888279ac --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Deployment.json @@ -0,0 +1,190 @@ +{ + "title": "Get KubernetesResources - Deployment", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "deployment-nginx-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/deployment-nginx-default", + "name": "deployment-nginx-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "nginx", + "namespaceName": "default", + "uid": "b1c2d3e4-f5a6-7890-bcde-f12345678901", + "resourceVersion": "9012345", + "generation": 3, + "creationTimestamp": "2026-04-15T09:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + }, + { + "name": "version", + "value": "1.25" + } + ], + "annotations": [ + { + "name": "deployment.kubernetes.io/revision", + "value": "3" + } + ] + }, + "spec": { + "replicas": 3, + "selector": [ + { + "name": "app", + "value": "nginx" + } + ], + "strategyType": "RollingUpdate", + "maxUnavailable": "25%", + "maxSurge": "25%", + "serviceAccountName": "nginx-sa", + "priorityClassName": "high-priority", + "nodeSelector": [ + { + "name": "kubernetes.io/os", + "value": "linux" + } + ], + "securityContext": { + "runAsNonRoot": true, + "runAsUser": 1000, + "fsGroup": 2000, + "seccompProfile": "RuntimeDefault", + "appArmorProfile": "RuntimeDefault" + }, + "tolerations": [ + { + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "nginx-config", + "sourceType": "configMap", + "source": "nginx-config" + } + ], + "containers": [ + { + "name": "nginx", + "image": "nginx:1.25.4", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "http", + "containerPort": 80, + "protocol": "TCP" + } + ], + "env": [ + { + "name": "ENV", + "value": "production" + } + ], + "envFrom": [ + { + "configMapRef": "app-config" + }, + { + "secretRef": "app-secrets", + "prefix": "SECRET_" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + }, + "limits": { + "cpu": "500m", + "memory": "512Mi" + } + }, + "volumeMounts": [ + { + "name": "nginx-config", + "mountPath": "/etc/nginx/conf.d", + "readOnly": true + } + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "privileged": false, + "capabilities": { + "drop": [ + "ALL" + ] + } + } + } + ] + }, + "status": { + "replicas": 3, + "readyReplicas": 3, + "availableReplicas": 3, + "updatedReplicas": 3, + "unavailableReplicas": 0, + "observedGeneration": 3, + "conditions": [ + { + "type": "Available", + "status": "True", + "reason": "MinimumReplicasAvailable", + "message": "Deployment has minimum availability.", + "lastTransitionTime": "2026-04-15T09:01:30Z" + }, + { + "type": "Progressing", + "status": "True", + "reason": "NewReplicaSetAvailable", + "message": "ReplicaSet \"nginx-7d9f8c\" has successfully progressed.", + "lastTransitionTime": "2026-04-15T09:01:30Z" + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "ScalingReplicaSet", + "age": "50d", + "from": "deployment-controller", + "message": "Scaled up replica set nginx-7d9f8c to 3" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-EndpointSlice.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-EndpointSlice.json new file mode 100644 index 000000000000..99a44d336b00 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-EndpointSlice.json @@ -0,0 +1,108 @@ +{ + "title": "Get KubernetesResources - EndpointSlice", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "endpointslice-myapp-abc12-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/endpointslice-myapp-abc12-default", + "name": "endpointslice-myapp-abc12-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "discovery.k8s.io/v1", + "kind": "EndpointSlice", + "metadata": { + "name": "myapp-abc12", + "namespaceName": "default", + "uid": "e5f6a7b8-c9d0-1234-efab-567890123456", + "resourceVersion": "2345678", + "generation": 1, + "creationTimestamp": "2026-05-10T14:00:00Z", + "labels": [ + { + "name": "kubernetes.io/service-name", + "value": "myapp" + }, + { + "name": "endpointslice.kubernetes.io/managed-by", + "value": "endpointslice-controller.k8s.io" + } + ], + "ownerReferences": [ + { + "apiVersion": "v1", + "kind": "Service", + "name": "myapp", + "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" + } + ] + }, + "spec": { + "endpointSliceAddressType": "IPv4", + "endpointSliceEndpoints": [ + { + "addresses": [ + "10.244.1.5" + ], + "ready": true, + "nodeName": "aks-nodepool1-12345678-vmss000000", + "targetRefKind": "Pod", + "targetRefName": "myapp-6d8f9c-xk2pv", + "targetRefNamespace": "default" + }, + { + "addresses": [ + "10.244.2.8" + ], + "ready": true, + "nodeName": "aks-nodepool1-12345678-vmss000001", + "targetRefKind": "Pod", + "targetRefName": "myapp-6d8f9c-mn7qr", + "targetRefNamespace": "default" + }, + { + "addresses": [ + "10.244.3.12" + ], + "ready": false, + "nodeName": "aks-nodepool1-12345678-vmss000002", + "targetRefKind": "Pod", + "targetRefName": "myapp-6d8f9c-pz4st", + "targetRefNamespace": "default" + } + ], + "endpointSlicePorts": [ + { + "port": 8080, + "protocol": "TCP", + "name": "http" + }, + { + "port": 8443, + "protocol": "TCP", + "name": "https" + } + ] + }, + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-HorizontalPodAutoscaler.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-HorizontalPodAutoscaler.json new file mode 100644 index 000000000000..30ba9a88c27b --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-HorizontalPodAutoscaler.json @@ -0,0 +1,110 @@ +{ + "title": "Get KubernetesResources - HorizontalPodAutoscaler", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "horizontalpodautoscaler-nginx-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/horizontalpodautoscaler-nginx-default", + "name": "horizontalpodautoscaler-nginx-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "autoscaling/v2", + "kind": "HorizontalPodAutoscaler", + "metadata": { + "name": "nginx-hpa", + "namespaceName": "default", + "uid": "e7f8a9b0-c1d2-3456-efab-678901234567", + "resourceVersion": "1578901", + "creationTimestamp": "2026-04-20T10:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + } + ] + }, + "spec": { + "scaleTargetRefKind": "Deployment", + "scaleTargetRefName": "nginx", + "minReplicas": 2, + "maxReplicas": 10, + "additionalFields": [ + { + "name": "metrics[0].type", + "value": "Resource" + }, + { + "name": "metrics[0].resource.name", + "value": "cpu" + }, + { + "name": "metrics[0].resource.target.type", + "value": "Utilization" + }, + { + "name": "metrics[0].resource.target.averageUtilization", + "value": "70" + }, + { + "name": "metrics[1].type", + "value": "Resource" + }, + { + "name": "metrics[1].resource.name", + "value": "memory" + }, + { + "name": "metrics[1].resource.target.type", + "value": "Utilization" + }, + { + "name": "metrics[1].resource.target.averageUtilization", + "value": "80" + } + ] + }, + "status": { + "currentReplicas": 3, + "desiredReplicas": 3, + "lastScaleTime": "2026-04-20T10:00:00Z", + "conditions": [ + { + "type": "AbleToScale", + "status": "True", + "reason": "ReadyForNewScale", + "message": "recommended size matches current size", + "lastTransitionTime": "2026-04-20T10:01:00Z" + }, + { + "type": "ScalingActive", + "status": "True", + "reason": "ValidMetricFound", + "message": "the HPA was able to successfully calculate a replica count", + "lastTransitionTime": "2026-04-20T10:01:00Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Ingress.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Ingress.json new file mode 100644 index 000000000000..8585220fe5f0 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Ingress.json @@ -0,0 +1,105 @@ +{ + "title": "Get KubernetesResources - Ingress", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "ingress-myapp-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/ingress-myapp-default", + "name": "ingress-myapp-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "networking.k8s.io/v1", + "kind": "Ingress", + "metadata": { + "name": "myapp", + "namespaceName": "default", + "uid": "a3b4c5d6-e7f8-9012-abcd-234567890123", + "resourceVersion": "1134567", + "creationTimestamp": "2026-04-01T08:00:00Z", + "labels": [ + { + "name": "app", + "value": "myapp" + } + ], + "annotations": [ + { + "name": "nginx.ingress.kubernetes.io/rewrite-target", + "value": "/" + }, + { + "name": "nginx.ingress.kubernetes.io/ssl-redirect", + "value": "true" + } + ] + }, + "spec": { + "ingressClassName": "nginx", + "defaultBackendServiceName": "default-backend", + "defaultBackendServicePort": "80", + "ingressRules": [ + { + "host": "myapp.example.com", + "paths": [ + { + "path": "/api", + "pathType": "Prefix", + "serviceName": "myapp-api", + "servicePort": "8080" + }, + { + "path": "/", + "pathType": "Prefix", + "serviceName": "myapp-frontend", + "servicePort": "80" + } + ] + } + ], + "ingressTls": [ + { + "hosts": [ + "myapp.example.com" + ], + "secretName": "myapp-tls-cert" + } + ] + }, + "status": { + "loadBalancerIngress": [ + "203.0.113.10" + ], + "conditions": [] + }, + "events": [ + { + "type": "Normal", + "reason": "Sync", + "age": "1h", + "from": "nginx-ingress-controller", + "message": "Scheduled for sync" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-IngressClass.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-IngressClass.json new file mode 100644 index 000000000000..1ba627df1796 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-IngressClass.json @@ -0,0 +1,68 @@ +{ + "title": "Get KubernetesResources - IngressClass", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "ingressclass-nginx", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/ingressclass-nginx", + "name": "ingressclass-nginx", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "networking.k8s.io/v1", + "kind": "IngressClass", + "metadata": { + "name": "nginx", + "uid": "a3b4c5d6-e7f8-9012-abcd-456789012345", + "resourceVersion": "9345678", + "creationTimestamp": "2026-01-10T07:30:00Z", + "labels": [ + { + "name": "app.kubernetes.io/component", + "value": "controller" + }, + { + "name": "app.kubernetes.io/instance", + "value": "ingress-nginx" + }, + { + "name": "app.kubernetes.io/name", + "value": "ingress-nginx" + } + ], + "annotations": [ + { + "name": "ingressclass.kubernetes.io/is-default-class", + "value": "true" + } + ] + }, + "spec": { + "ingressController": "k8s.io/ingress-nginx" + }, + "status": { + "conditions": [] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Job.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Job.json new file mode 100644 index 000000000000..59c73ec2133e --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Job.json @@ -0,0 +1,128 @@ +{ + "title": "Get KubernetesResources - Job", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "job-db-migration-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/job-db-migration-default", + "name": "job-db-migration-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "batch/v1", + "kind": "Job", + "metadata": { + "name": "db-migration", + "namespaceName": "default", + "uid": "b8c9d0e1-f2a3-4567-bcde-789012345678", + "resourceVersion": "7890123", + "generation": 1, + "creationTimestamp": "2026-06-01T06:00:00Z", + "labels": [ + { + "name": "app", + "value": "db-migration" + }, + { + "name": "batch.kubernetes.io/job-name", + "value": "db-migration" + } + ] + }, + "spec": { + "completions": 1, + "parallelism": 1, + "backoffLimit": 3, + "suspend": false, + "activeDeadlineSeconds": 600, + "completionMode": "NonIndexed", + "ttlSecondsAfterFinished": 3600, + "serviceAccountName": "migration-sa", + "containers": [ + { + "name": "migration", + "image": "myapp/migration:v2.3.0", + "imagePullPolicy": "Always", + "envFrom": [ + { + "secretRef": "db-credentials" + }, + { + "configMapRef": "migration-config" + } + ], + "resources": { + "requests": { + "cpu": "200m", + "memory": "256Mi" + }, + "limits": { + "cpu": "500m", + "memory": "512Mi" + } + }, + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "privileged": false, + "runAsNonRoot": true, + "runAsUser": 1000 + } + } + ] + }, + "status": { + "activeJobCount": 0, + "succeededJobCount": 1, + "failedJobCount": 0, + "readyPods": 0, + "jobStartTime": "2026-06-01T06:00:05Z", + "jobCompletionTime": "2026-06-01T06:02:30Z", + "conditions": [ + { + "type": "Complete", + "status": "True", + "reason": "Completed", + "message": "Job completed successfully", + "lastTransitionTime": "2026-06-01T06:02:30Z" + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "SuccessfulCreate", + "age": "3d", + "from": "job-controller", + "message": "Created pod: db-migration-xk9p2" + }, + { + "type": "Normal", + "reason": "Completed", + "age": "3d", + "from": "job-controller", + "message": "Job completed" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-NetworkPolicy.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-NetworkPolicy.json new file mode 100644 index 000000000000..12821dd35be1 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-NetworkPolicy.json @@ -0,0 +1,88 @@ +{ + "title": "Get KubernetesResources - NetworkPolicy", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "networkpolicy-deny-external-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/networkpolicy-deny-external-default", + "name": "networkpolicy-deny-external-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "networking.k8s.io/v1", + "kind": "NetworkPolicy", + "metadata": { + "name": "deny-external", + "namespaceName": "default", + "uid": "b4c5d6e7-f8a9-0123-bcde-345678901234", + "resourceVersion": "1245678", + "creationTimestamp": "2026-02-15T12:00:00Z", + "labels": [ + { + "name": "policy-type", + "value": "isolation" + } + ] + }, + "spec": { + "podSelectorLabels": [ + { + "name": "app", + "value": "myapp" + } + ], + "networkPolicyTypes": [ + "Ingress", + "Egress" + ], + "additionalFields": [ + { + "name": "ingress[0].from[0].podSelector.matchLabels.app", + "value": "frontend" + }, + { + "name": "ingress[0].ports[0].port", + "value": "8080" + }, + { + "name": "ingress[0].ports[0].protocol", + "value": "TCP" + }, + { + "name": "egress[0].to[0].namespaceSelector.matchLabels.name", + "value": "kube-system" + }, + { + "name": "egress[0].ports[0].port", + "value": "53" + }, + { + "name": "egress[0].ports[0].protocol", + "value": "UDP" + } + ] + }, + "status": {}, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Node.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Node.json new file mode 100644 index 000000000000..6a3d8f0d39fe --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Node.json @@ -0,0 +1,155 @@ +{ + "title": "Get KubernetesResources - Node", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "node-aks-nodepool1-12345678-0", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/node-aks-nodepool1-12345678-0", + "name": "node-aks-nodepool1-12345678-0", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "Node", + "metadata": { + "name": "aks-nodepool1-12345678-0", + "uid": "a7b8c9d0-e1f2-3456-abcd-678901234567", + "resourceVersion": "6789012", + "creationTimestamp": "2026-01-10T07:00:00Z", + "labels": [ + { + "name": "kubernetes.io/os", + "value": "linux" + }, + { + "name": "kubernetes.io/arch", + "value": "amd64" + }, + { + "name": "node.kubernetes.io/instance-type", + "value": "Standard_D4s_v3" + }, + { + "name": "topology.kubernetes.io/zone", + "value": "eastus-1" + }, + { + "name": "agentpool", + "value": "nodepool1" + } + ], + "annotations": [ + { + "name": "node.alpha.kubernetes.io/ttl", + "value": "0" + }, + { + "name": "volumes.kubernetes.io/controller-managed-attach-detach", + "value": "true" + } + ] + }, + "spec": { + "providerId": "azure:///subscriptions/subId1/resourceGroups/mc_rg1_clusterName1_eastus/providers/Microsoft.Compute/virtualMachines/aks-nodepool1-12345678-0", + "podCidr": "10.244.0.0/24", + "unschedulable": false, + "taints": [ + { + "key": "node.kubernetes.io/memory-pressure", + "effect": "PreferNoSchedule" + } + ] + }, + "status": { + "nodeAddresses": [ + { + "type": "InternalIP", + "address": "10.240.0.4" + }, + { + "type": "Hostname", + "address": "aks-nodepool1-12345678-0" + } + ], + "nodeInfo": { + "kernelVersion": "5.15.0-1057-azure", + "osImage": "Ubuntu 22.04.4 LTS", + "containerRuntimeVersion": "containerd://1.7.13", + "kubeletVersion": "v1.29.2", + "kubeProxyVersion": "v1.29.2", + "architecture": "amd64", + "operatingSystem": "linux" + }, + "nodeCapacity": { + "cpu": "4", + "memory": "16Gi", + "pods": "110", + "ephemeralStorage": "119Gi" + }, + "nodeAllocatable": { + "cpu": "3850m", + "memory": "14902Mi", + "pods": "110", + "ephemeralStorage": "109Gi" + }, + "volumesAttached": [ + { + "name": "kubernetes-dynamic-pvc-a1b2c3d4", + "devicePath": "/dev/sdc" + }, + { + "name": "kubernetes-dynamic-pvc-e5f6a7b8", + "devicePath": "/dev/sdd" + } + ], + "conditions": [ + { + "type": "MemoryPressure", + "status": "False", + "reason": "KubeletHasSufficientMemory", + "lastTransitionTime": "2026-01-10T07:01:00Z" + }, + { + "type": "DiskPressure", + "status": "False", + "reason": "KubeletHasNoDiskPressure", + "lastTransitionTime": "2026-01-10T07:01:00Z" + }, + { + "type": "PIDPressure", + "status": "False", + "reason": "KubeletHasSufficientPID", + "lastTransitionTime": "2026-01-10T07:01:00Z" + }, + { + "type": "Ready", + "status": "True", + "reason": "KubeletReady", + "message": "kubelet is posting ready status", + "lastTransitionTime": "2026-01-10T07:01:30Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-PersistentVolume.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-PersistentVolume.json new file mode 100644 index 000000000000..aa822cfed8ac --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-PersistentVolume.json @@ -0,0 +1,64 @@ +{ + "title": "Get KubernetesResources - PersistentVolume", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "persistentvolume-pvc-d0e1f2a3-b4c5-6789-defa", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/persistentvolume-pvc-d0e1f2a3-b4c5-6789-defa", + "name": "persistentvolume-pvc-d0e1f2a3-b4c5-6789-defa", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "PersistentVolume", + "metadata": { + "name": "pvc-d0e1f2a3-b4c5-6789-defa-901234567890", + "uid": "e1f2a3b4-c5d6-7890-efab-012345678901", + "resourceVersion": "9123456", + "creationTimestamp": "2026-03-01T10:00:05Z", + "labels": [ + { + "name": "failure-domain.beta.kubernetes.io/zone", + "value": "eastus-1" + } + ] + }, + "spec": { + "storageCapacity": "50Gi", + "accessModes": [ + "ReadWriteOnce" + ], + "reclaimPolicy": "Delete", + "storageClassName": "managed-premium", + "volumeMode": "Filesystem", + "claimRefNamespace": "default", + "boundVolumeName": "data-postgres-0", + "csiDriver": "disk.csi.azure.com", + "csiVolumeHandle": "/subscriptions/subId1/resourceGroups/mc_rg1_clusterName1_eastus/providers/Microsoft.Compute/disks/pvc-d0e1f2a3-b4c5-6789-defa-901234567890" + }, + "status": { + "phase": "Bound" + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-PersistentVolumeClaim.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-PersistentVolumeClaim.json new file mode 100644 index 000000000000..85a8f4d7611e --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-PersistentVolumeClaim.json @@ -0,0 +1,70 @@ +{ + "title": "Get KubernetesResources - PersistentVolumeClaim", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "persistentvolumeclaim-data-postgres-0-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/persistentvolumeclaim-data-postgres-0-default", + "name": "persistentvolumeclaim-data-postgres-0-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "PersistentVolumeClaim", + "metadata": { + "name": "data-postgres-0", + "namespaceName": "default", + "uid": "d0e1f2a3-b4c5-6789-defa-901234567890", + "resourceVersion": "9012345", + "creationTimestamp": "2026-03-01T10:00:05Z", + "labels": [ + { + "name": "app", + "value": "postgres" + }, + { + "name": "statefulset.kubernetes.io/pod-name", + "value": "postgres-0" + } + ] + }, + "spec": { + "accessModes": [ + "ReadWriteOnce" + ], + "storageClassName": "managed-premium", + "storageRequest": "50Gi", + "volumeMode": "Filesystem", + "boundVolumeName": "pvc-d0e1f2a3-b4c5-6789-defa-901234567890" + }, + "status": { + "phase": "Bound", + "pvcCapacity": "50Gi", + "pvcAccessModes": [ + "ReadWriteOnce" + ], + "conditions": [] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Pod.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Pod.json new file mode 100644 index 000000000000..30f43f8b4ffc --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Pod.json @@ -0,0 +1,238 @@ +{ + "title": "Get KubernetesResources - Pod", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "pod-coredns-5d78c9869d-r4pzt-kube-system", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/pod-coredns-5d78c9869d-r4pzt-kube-system", + "name": "pod-coredns-5d78c9869d-r4pzt-kube-system", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "name": "coredns-5d78c9869d-r4pzt", + "namespaceName": "kube-system", + "uid": "d4e5f6a7-b8c9-0123-defa-234567890123", + "resourceVersion": "7712091", + "generation": 1, + "creationTimestamp": "2026-04-01T08:05:00Z", + "labels": [ + { + "name": "k8s-app", + "value": "kube-dns" + }, + { + "name": "pod-template-hash", + "value": "5d78c9869d" + } + ], + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "coredns-5d78c9869d", + "uid": "e5f6a7b8-c9d0-1234-efab-345678901234", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "nodeName": "aks-nodepool1-12345678-1", + "restartPolicy": "Always", + "serviceAccountName": "coredns", + "dnsPolicy": "Default", + "terminationGracePeriodSeconds": 30, + "priorityClassName": "system-cluster-critical", + "securityContext": { + "runAsNonRoot": true + }, + "tolerations": [ + { + "key": "CriticalAddonsOnly", + "operator": "Exists" + }, + { + "key": "node-role.kubernetes.io/control-plane", + "operator": "Exists", + "effect": "NoSchedule" + } + ], + "volumes": [ + { + "name": "config-volume", + "sourceType": "configMap", + "source": "coredns" + }, + { + "name": "kube-api-access", + "sourceType": "projected" + } + ], + "containers": [ + { + "name": "coredns", + "image": "registry.k8s.io/coredns/coredns:v1.11.1", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "dns", + "containerPort": 53, + "protocol": "UDP" + }, + { + "name": "dns-tcp", + "containerPort": 53, + "protocol": "TCP" + }, + { + "name": "metrics", + "containerPort": 9153, + "protocol": "TCP" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "70Mi" + }, + "limits": { + "memory": "170Mi" + } + }, + "volumeMounts": [ + { + "name": "config-volume", + "mountPath": "/etc/coredns", + "readOnly": true + }, + { + "name": "kube-api-access", + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "readOnly": true + } + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "capabilities": { + "add": [ + "NET_BIND_SERVICE" + ], + "drop": [ + "ALL" + ] + } + }, + "livenessProbe": { + "type": "HTTPGet", + "path": "/health", + "port": 8080 + }, + "readinessProbe": { + "type": "HTTPGet", + "path": "/ready", + "port": 8181 + } + } + ] + }, + "status": { + "phase": "Running", + "podIp": "10.244.0.3", + "podIps": [ + "10.244.0.3" + ], + "hostIp": "10.240.0.5", + "hostIps": [ + "10.240.0.5" + ], + "startTime": "2026-04-01T08:05:02Z", + "qosClass": "Burstable", + "reason": "", + "initContainerStatuses": [], + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:02Z" + }, + { + "type": "Ready", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:14Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:14Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:00Z" + } + ], + "containerStatuses": [ + { + "name": "coredns", + "ready": true, + "restartCount": 0, + "started": true, + "image": "registry.k8s.io/coredns/coredns:v1.11.1", + "containerId": "containerd://b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3", + "state": { + "running": { + "startedAt": "2026-04-01T08:05:13Z" + } + } + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "Scheduled", + "age": "58d", + "from": "default-scheduler", + "message": "Successfully assigned kube-system/coredns-5d78c9869d-r4pzt to aks-nodepool1-12345678-1" + }, + { + "type": "Normal", + "reason": "Pulled", + "age": "58d", + "from": "kubelet", + "message": "Container image \"registry.k8s.io/coredns/coredns:v1.11.1\" already present on machine" + }, + { + "type": "Normal", + "reason": "Started", + "age": "58d", + "from": "kubelet", + "message": "Started container coredns" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-PodDisruptionBudget.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-PodDisruptionBudget.json new file mode 100644 index 000000000000..0830dd53428e --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-PodDisruptionBudget.json @@ -0,0 +1,73 @@ +{ + "title": "Get KubernetesResources - PodDisruptionBudget", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "poddisruptionbudget-nginx-pdb-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/poddisruptionbudget-nginx-pdb-default", + "name": "poddisruptionbudget-nginx-pdb-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "policy/v1", + "kind": "PodDisruptionBudget", + "metadata": { + "name": "nginx-pdb", + "namespaceName": "default", + "uid": "f8a9b0c1-d2e3-4567-fabc-789012345678", + "resourceVersion": "1689012", + "creationTimestamp": "2026-04-21T09:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + } + ] + }, + "spec": { + "minAvailable": "2", + "serviceSelector": [ + { + "name": "app", + "value": "nginx" + } + ] + }, + "status": { + "currentHealthy": 3, + "desiredHealthy": 2, + "disruptionsAllowed": 1, + "expectedPods": 3, + "conditions": [ + { + "type": "DisruptionAllowed", + "status": "True", + "reason": "SufficientPods", + "message": "3 healthy replicas found, disruption is allowed", + "lastTransitionTime": "2026-04-21T09:01:00Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ReplicaSet.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ReplicaSet.json new file mode 100644 index 000000000000..d7af1faa6cfc --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ReplicaSet.json @@ -0,0 +1,114 @@ +{ + "title": "Get KubernetesResources - ReplicaSet", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "replicaset-nginx-7d9f8c-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/replicaset-nginx-7d9f8c-default", + "name": "replicaset-nginx-7d9f8c-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "metadata": { + "name": "nginx-7d9f8c", + "namespaceName": "default", + "uid": "e4f5a6b7-c8d9-0123-efab-456789012345", + "resourceVersion": "4567890", + "generation": 1, + "creationTimestamp": "2026-04-15T09:00:10Z", + "labels": [ + { + "name": "app", + "value": "nginx" + }, + { + "name": "pod-template-hash", + "value": "7d9f8c" + } + ], + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "Deployment", + "name": "nginx", + "uid": "b1c2d3e4-f5a6-7890-bcde-f12345678901", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "replicas": 3, + "selector": [ + { + "name": "app", + "value": "nginx" + }, + { + "name": "pod-template-hash", + "value": "7d9f8c" + } + ], + "containers": [ + { + "name": "nginx", + "image": "nginx:1.25.4", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "http", + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + }, + "limits": { + "cpu": "500m", + "memory": "512Mi" + } + } + } + ] + }, + "status": { + "replicas": 3, + "readyReplicas": 3, + "availableReplicas": 3, + "observedGeneration": 1, + "conditions": [ + { + "type": "ReplicaFailure", + "status": "False", + "lastTransitionTime": "2026-04-15T09:00:10Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Role.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Role.json new file mode 100644 index 000000000000..f0fe0aad8ef9 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Role.json @@ -0,0 +1,75 @@ +{ + "title": "Get KubernetesResources - Role", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "role-pod-reader-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/role-pod-reader-default", + "name": "role-pod-reader-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "rbac.authorization.k8s.io/v1", + "kind": "Role", + "metadata": { + "name": "pod-reader", + "namespaceName": "default", + "uid": "c5d6e7f8-a9b0-1234-cdef-456789012345", + "resourceVersion": "1356789", + "creationTimestamp": "2026-01-20T14:00:00Z" + }, + "spec": { + "rbacRules": [ + { + "apiGroups": [ + "" + ], + "resources": [ + "pods", + "pods/log" + ], + "verbs": [ + "get", + "list", + "watch" + ] + }, + { + "apiGroups": [ + "apps" + ], + "resources": [ + "deployments", + "replicasets" + ], + "verbs": [ + "get", + "list" + ] + } + ] + }, + "status": {}, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-RoleBinding.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-RoleBinding.json new file mode 100644 index 000000000000..4989fe9bb673 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-RoleBinding.json @@ -0,0 +1,59 @@ +{ + "title": "Get KubernetesResources - RoleBinding", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "rolebinding-read-pods-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/rolebinding-read-pods-default", + "name": "rolebinding-read-pods-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "rbac.authorization.k8s.io/v1", + "kind": "RoleBinding", + "metadata": { + "name": "read-pods", + "namespaceName": "default", + "uid": "d6e7f8a9-b0c1-2345-defa-567890123456", + "resourceVersion": "1467890", + "creationTimestamp": "2026-01-20T14:05:00Z" + }, + "spec": { + "rbacSubjects": [ + { + "kind": "ServiceAccount", + "name": "monitoring-sa", + "namespaceName": "monitoring" + }, + { + "kind": "User", + "name": "alice@example.com" + } + ], + "rbacRoleRefKind": "Role", + "rbacRoleRefName": "pod-reader" + }, + "status": {}, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Service.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Service.json new file mode 100644 index 000000000000..6de92eec1962 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-Service.json @@ -0,0 +1,103 @@ +{ + "title": "Get KubernetesResources - Service", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "service-nginx-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/service-nginx-default", + "name": "service-nginx-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "Service", + "metadata": { + "name": "nginx", + "namespaceName": "default", + "uid": "f5a6b7c8-d9e0-1234-fabc-567890123456", + "resourceVersion": "5678901", + "creationTimestamp": "2026-04-15T09:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + } + ] + }, + "spec": { + "serviceType": "LoadBalancer", + "clusterIp": "10.0.128.45", + "servicePorts": [ + { + "name": "http", + "port": 80, + "targetPort": "http", + "protocol": "TCP" + }, + { + "name": "https", + "port": 443, + "targetPort": "https", + "protocol": "TCP" + } + ], + "serviceSelector": [ + { + "name": "app", + "value": "nginx" + } + ], + "externalTrafficPolicy": "Local", + "loadBalancerClass": "service.beta.kubernetes.io/azure-load-balancer-internal", + "loadBalancerIp": "52.183.12.45" + }, + "status": { + "loadBalancerIngress": [ + "52.183.12.45" + ], + "conditions": [ + { + "type": "Available", + "status": "True", + "lastTransitionTime": "2026-04-15T09:02:00Z" + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "EnsuringLoadBalancer", + "age": "50d", + "from": "service-controller", + "message": "Ensuring load balancer" + }, + { + "type": "Normal", + "reason": "EnsuredLoadBalancer", + "age": "50d", + "from": "service-controller", + "message": "Ensured load balancer" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ServiceAccount.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ServiceAccount.json new file mode 100644 index 000000000000..060e7c2a1537 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ServiceAccount.json @@ -0,0 +1,65 @@ +{ + "title": "Get KubernetesResources - ServiceAccount", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "serviceaccount-coredns-kube-system", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/serviceaccount-coredns-kube-system", + "name": "serviceaccount-coredns-kube-system", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "ServiceAccount", + "metadata": { + "name": "coredns", + "namespaceName": "kube-system", + "uid": "b2c3d4e5-f6a7-8901-bcde-f12345678901", + "resourceVersion": "890123", + "creationTimestamp": "2026-01-01T00:00:00Z", + "labels": [ + { + "name": "k8s-app", + "value": "kube-dns" + }, + { + "name": "kubernetes.io/cluster-service", + "value": "true" + } + ], + "annotations": [ + { + "name": "kubectl.kubernetes.io/last-applied-configuration", + "value": "{}" + } + ] + }, + "spec": { + "automountServiceAccountToken": false + }, + "status": { + "conditions": [] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-StatefulSet.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-StatefulSet.json new file mode 100644 index 000000000000..8b299265f767 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-StatefulSet.json @@ -0,0 +1,170 @@ +{ + "title": "Get KubernetesResources - StatefulSet", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "statefulset-postgres-data", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/statefulset-postgres-data", + "name": "statefulset-postgres-data", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "apps/v1", + "kind": "StatefulSet", + "metadata": { + "name": "postgres", + "namespaceName": "data", + "uid": "c2d3e4f5-a6b7-8901-cdef-234567890123", + "resourceVersion": "7654321", + "generation": 2, + "creationTimestamp": "2026-03-10T08:00:00Z", + "labels": [ + { + "name": "app", + "value": "postgres" + }, + { + "name": "tier", + "value": "database" + } + ] + }, + "spec": { + "replicas": 3, + "serviceName": "postgres-headless", + "selector": [ + { + "name": "app", + "value": "postgres" + } + ], + "strategyType": "RollingUpdate", + "maxUnavailableReplicas": "1", + "podManagementPolicy": "OrderedReady", + "serviceAccountName": "postgres-sa", + "securityContext": { + "runAsUser": 999, + "runAsGroup": 999, + "fsGroup": 999, + "runAsNonRoot": true + }, + "volumes": [ + { + "name": "config", + "sourceType": "configMap", + "source": "postgres-config" + } + ], + "containers": [ + { + "name": "postgres", + "image": "postgres:15.4", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "postgres", + "containerPort": 5432, + "protocol": "TCP" + } + ], + "env": [ + { + "name": "POSTGRES_DB", + "value": "appdb" + } + ], + "envFrom": [ + { + "secretRef": "postgres-credentials" + } + ], + "resources": { + "requests": { + "cpu": "500m", + "memory": "1Gi" + }, + "limits": { + "cpu": "2", + "memory": "4Gi" + } + }, + "volumeMounts": [ + { + "name": "data", + "mountPath": "/var/lib/postgresql/data", + "subPath": "postgres" + }, + { + "name": "config", + "mountPath": "/etc/postgresql", + "readOnly": true + } + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": false, + "privileged": false + } + } + ], + "volumeClaimTemplates": [ + { + "name": "data", + "accessModes": [ + "ReadWriteOnce" + ], + "storageClassName": "managed-premium", + "storageRequest": "20Gi", + "volumeMode": "Filesystem" + } + ] + }, + "status": { + "replicas": 3, + "readyReplicas": 3, + "availableReplicas": 3, + "currentReplicas": 3, + "updatedReplicas": 3, + "currentRevision": "postgres-7d4c9f6b8", + "updateRevision": "postgres-7d4c9f6b8", + "observedGeneration": 2, + "conditions": [ + { + "type": "Available", + "status": "True", + "reason": "MinimumReplicasAvailable", + "lastTransitionTime": "2026-03-10T08:05:00Z" + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "SuccessfulCreate", + "age": "86d", + "from": "statefulset-controller", + "message": "create Pod postgres-0 in StatefulSet postgres successful" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-StorageClass.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-StorageClass.json new file mode 100644 index 000000000000..5c40ecda4f5c --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-StorageClass.json @@ -0,0 +1,69 @@ +{ + "title": "Get KubernetesResources - StorageClass", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "storageclass-managed-premium", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/storageclass-managed-premium", + "name": "storageclass-managed-premium", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "storage.k8s.io/v1", + "kind": "StorageClass", + "metadata": { + "name": "managed-premium", + "uid": "f2a3b4c5-d6e7-8901-fabc-123456789012", + "resourceVersion": "1023456", + "creationTimestamp": "2026-01-10T07:00:10Z", + "annotations": [ + { + "name": "storageclass.kubernetes.io/is-default-class", + "value": "false" + } + ] + }, + "spec": { + "provisioner": "disk.csi.azure.com", + "reclaimPolicy": "Delete", + "volumeBindingMode": "WaitForFirstConsumer", + "allowVolumeExpansion": true, + "additionalFields": [ + { + "name": "parameters.skuName", + "value": "Premium_LRS" + }, + { + "name": "parameters.kind", + "value": "Managed" + }, + { + "name": "parameters.cachingMode", + "value": "ReadOnly" + } + ] + }, + "status": {}, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ValidatingAdmissionPolicy.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ValidatingAdmissionPolicy.json new file mode 100644 index 000000000000..24f337a7345d --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ValidatingAdmissionPolicy.json @@ -0,0 +1,73 @@ +{ + "title": "Get KubernetesResources - ValidatingAdmissionPolicy", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "validatingadmissionpolicy-deny-privileged-containers", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/validatingadmissionpolicy-deny-privileged-containers", + "name": "validatingadmissionpolicy-deny-privileged-containers", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "admissionregistration.k8s.io/v1", + "kind": "ValidatingAdmissionPolicy", + "metadata": { + "name": "deny-privileged-containers", + "uid": "b8c9d0e1-f2a3-4567-bcde-890123456789", + "resourceVersion": "5678901", + "generation": 1, + "creationTimestamp": "2026-03-15T11:00:00Z", + "labels": [ + { + "name": "policy.security.io/category", + "value": "pod-security" + } + ], + "annotations": [ + { + "name": "policy.security.io/severity", + "value": "critical" + } + ] + }, + "spec": { + "admissionPolicyFailurePolicy": "Fail", + "admissionPolicyMatchConstraints": [ + "Group=* Resource=pods Operations=[CREATE UPDATE]", + "Group=apps Resource=deployments Operations=[CREATE UPDATE]", + "Group=apps Resource=statefulsets Operations=[CREATE UPDATE]" + ] + }, + "status": { + "conditions": [ + { + "type": "Ready", + "status": "True", + "reason": "ValidationApplied", + "message": "Policy is active and enforcing.", + "lastTransitionTime": "2026-03-15T11:01:00Z" + } + ] + }, + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ValidatingAdmissionPolicyBinding.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ValidatingAdmissionPolicyBinding.json new file mode 100644 index 000000000000..10b622a6f7aa --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-ValidatingAdmissionPolicyBinding.json @@ -0,0 +1,66 @@ +{ + "title": "Get KubernetesResources - ValidatingAdmissionPolicyBinding", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "validatingadmissionpolicybinding-deny-privileged-binding", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/validatingadmissionpolicybinding-deny-privileged-binding", + "name": "validatingadmissionpolicybinding-deny-privileged-binding", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "admissionregistration.k8s.io/v1", + "kind": "ValidatingAdmissionPolicyBinding", + "metadata": { + "name": "deny-privileged-binding", + "uid": "c9d0e1f2-a3b4-5678-cdef-901234567890", + "resourceVersion": "6789012", + "generation": 1, + "creationTimestamp": "2026-03-15T11:05:00Z", + "labels": [ + { + "name": "policy.security.io/category", + "value": "pod-security" + } + ] + }, + "spec": { + "admissionPolicyBindingPolicyName": "deny-privileged-containers", + "admissionPolicyValidationActions": [ + "Deny", + "Audit" + ] + }, + "status": { + "conditions": [ + { + "type": "Ready", + "status": "True", + "reason": "BindingApplied", + "message": "PolicyBinding is active.", + "lastTransitionTime": "2026-03-15T11:06:00Z" + } + ] + }, + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-VolumeAttachment.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-VolumeAttachment.json new file mode 100644 index 000000000000..f0e5993f0eb5 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources-VolumeAttachment.json @@ -0,0 +1,57 @@ +{ + "title": "Get KubernetesResources - VolumeAttachment", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "volumeattachment-csi-azuredisk-pvc-d0e1f2a3", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/volumeattachment-csi-azuredisk-pvc-d0e1f2a3", + "name": "volumeattachment-csi-azuredisk-pvc-d0e1f2a3", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "storage.k8s.io/v1", + "kind": "VolumeAttachment", + "metadata": { + "name": "csi-azuredisk-pvc-d0e1f2a3-b4c5-6789-defa-901234567890", + "uid": "e1f2a3b4-c5d6-7890-efab-234567890123", + "resourceVersion": "9123456", + "creationTimestamp": "2026-03-01T10:00:10Z", + "labels": [ + { + "name": "app.kubernetes.io/managed-by", + "value": "disk.csi.azure.com" + } + ] + }, + "spec": { + "attacherName": "disk.csi.azure.com", + "attachedVolumeName": "pvc-d0e1f2a3-b4c5-6789-defa-901234567890", + "nodeName": "aks-nodepool1-12345678-0" + }, + "status": { + "volumeAttached": true, + "conditions": [] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources.json new file mode 100644 index 000000000000..e4cbe5f019f7 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/GetKubernetesResources.json @@ -0,0 +1,286 @@ +{ + "title": "Get KubernetesResources", + "operationId": "KubernetesResources_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "kubernetesResourceName": "pod-nginx-6d4cf56db6-x7q2p-default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/pod-nginx-6d4cf56db6-x7q2p-default", + "name": "pod-nginx-6d4cf56db6-x7q2p-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "name": "nginx-6d4cf56db6-x7q2p", + "namespaceName": "default", + "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "resourceVersion": "8834210", + "generation": 1, + "creationTimestamp": "2026-05-01T10:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + }, + { + "name": "pod-template-hash", + "value": "6d4cf56db6" + } + ], + "annotations": [ + { + "name": "kubectl.kubernetes.io/last-applied-configuration", + "value": "{}" + } + ], + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "nginx-6d4cf56db6", + "uid": "c3d4e5f6-a7b8-9012-cdef-012345678901", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "nodeName": "aks-nodepool1-12345678-0", + "restartPolicy": "Always", + "serviceAccountName": "nginx-sa", + "dnsPolicy": "ClusterFirst", + "terminationGracePeriodSeconds": 30, + "priorityClassName": "high-priority", + "nodeSelector": [ + { + "name": "kubernetes.io/os", + "value": "linux" + }, + { + "name": "agentpool", + "value": "nodepool1" + } + ], + "hostNetwork": false, + "hostPid": false, + "hostIpc": false, + "runtimeClassName": "containerd", + "securityContext": { + "runAsUser": 1000, + "runAsGroup": 3000, + "fsGroup": 2000, + "runAsNonRoot": true, + "seccompProfile": "RuntimeDefault" + }, + "tolerations": [ + { + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + }, + { + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "effect": "NoExecute", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "nginx-config", + "sourceType": "configMap", + "source": "nginx-config-map" + }, + { + "name": "tmp-dir", + "sourceType": "emptyDir", + "sizeLimit": "50Mi" + }, + { + "name": "kube-api-access", + "sourceType": "projected" + } + ], + "containers": [ + { + "name": "nginx", + "image": "nginx:1.25.4", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "http", + "containerPort": 80, + "protocol": "TCP" + }, + { + "name": "https", + "containerPort": 443, + "protocol": "TCP" + } + ], + "env": [ + { + "name": "POD_NAMESPACE", + "value": "default" + }, + { + "name": "NGINX_WORKER_PROCESSES", + "value": "2" + } + ], + "envFrom": [ + { + "configMapRef": "nginx-common-config" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + }, + "limits": { + "cpu": "200m", + "memory": "256Mi" + } + }, + "volumeMounts": [ + { + "name": "nginx-config", + "mountPath": "/etc/nginx/conf.d", + "readOnly": true + }, + { + "name": "tmp-dir", + "mountPath": "/tmp" + }, + { + "name": "kube-api-access", + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "readOnly": true + } + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "runAsNonRoot": true, + "runAsUser": 1000, + "privileged": false, + "seccompProfile": "RuntimeDefault", + "capabilities": { + "drop": [ + "ALL" + ] + } + }, + "livenessProbe": { + "type": "HTTPGet", + "path": "/healthz", + "port": 8080 + }, + "readinessProbe": { + "type": "HTTPGet", + "path": "/readyz", + "port": 8080 + } + } + ] + }, + "status": { + "phase": "Running", + "podIp": "10.244.1.42", + "podIps": [ + "10.244.1.42", + "fd00::1:2a" + ], + "hostIp": "10.240.0.4", + "hostIps": [ + "10.240.0.4" + ], + "startTime": "2026-05-01T10:00:05Z", + "qosClass": "Burstable", + "reason": "", + "initContainerStatuses": [], + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastTransitionTime": "2026-05-01T10:00:05Z" + }, + { + "type": "Ready", + "status": "True", + "lastTransitionTime": "2026-05-01T10:00:18Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastTransitionTime": "2026-05-01T10:00:18Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastTransitionTime": "2026-05-01T10:00:05Z" + } + ], + "containerStatuses": [ + { + "name": "nginx", + "ready": true, + "restartCount": 0, + "started": true, + "image": "nginx:1.25.4", + "containerId": "containerd://a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2", + "state": { + "running": { + "startedAt": "2026-05-01T10:00:17Z" + } + } + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "Scheduled", + "age": "28d", + "from": "default-scheduler", + "message": "Successfully assigned default/nginx-6d4cf56db6-x7q2p to aks-nodepool1-12345678-0" + }, + { + "type": "Normal", + "reason": "Pulled", + "age": "28d", + "from": "kubelet", + "message": "Container image \"nginx:1.25.4\" already present on machine" + }, + { + "type": "Normal", + "reason": "Started", + "age": "28d", + "from": "kubelet", + "message": "Started container nginx" + } + ] + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/ListKubernetesResources.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/ListKubernetesResources.json new file mode 100644 index 000000000000..fbcc5b17e76d --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/examples/ListKubernetesResources.json @@ -0,0 +1,308 @@ +{ + "title": "List KubernetesResources", + "operationId": "KubernetesResources_List", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/pod-coredns-5d78c9869d-r4pzt-kube-system", + "name": "pod-coredns-5d78c9869d-r4pzt-kube-system", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "name": "coredns-5d78c9869d-r4pzt", + "namespaceName": "kube-system", + "uid": "d4e5f6a7-b8c9-0123-defa-234567890123", + "resourceVersion": "7712091", + "generation": 1, + "creationTimestamp": "2026-04-01T08:05:00Z", + "labels": [ + { + "name": "k8s-app", + "value": "kube-dns" + }, + { + "name": "pod-template-hash", + "value": "5d78c9869d" + } + ], + "ownerReferences": [ + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "name": "coredns-5d78c9869d", + "uid": "e5f6a7b8-c9d0-1234-efab-345678901234", + "controller": true, + "blockOwnerDeletion": true + } + ] + }, + "spec": { + "nodeName": "aks-nodepool1-12345678-1", + "restartPolicy": "Always", + "serviceAccountName": "coredns", + "dnsPolicy": "Default", + "terminationGracePeriodSeconds": 30, + "securityContext": { + "runAsNonRoot": true + }, + "tolerations": [ + { + "key": "CriticalAddonsOnly", + "operator": "Exists" + }, + { + "key": "node-role.kubernetes.io/control-plane", + "operator": "Exists", + "effect": "NoSchedule" + } + ], + "volumes": [ + { + "name": "config-volume", + "sourceType": "configMap", + "source": "coredns" + }, + { + "name": "kube-api-access", + "sourceType": "projected" + } + ], + "containers": [ + { + "name": "coredns", + "image": "registry.k8s.io/coredns/coredns:v1.11.1", + "ports": [ + { + "name": "dns", + "containerPort": 53, + "protocol": "UDP" + }, + { + "name": "dns-tcp", + "containerPort": 53, + "protocol": "TCP" + }, + { + "name": "metrics", + "containerPort": 9153, + "protocol": "TCP" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "70Mi" + }, + "limits": { + "memory": "170Mi" + } + }, + "volumeMounts": [ + { + "name": "config-volume", + "mountPath": "/etc/coredns", + "readOnly": true + }, + { + "name": "kube-api-access", + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "readOnly": true + } + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "capabilities": { + "add": [ + "NET_BIND_SERVICE" + ], + "drop": [ + "ALL" + ] + } + } + } + ] + }, + "status": { + "phase": "Running", + "podIp": "10.244.0.3", + "hostIp": "10.240.0.5", + "startTime": "2026-04-01T08:05:02Z", + "qosClass": "Burstable", + "conditions": [ + { + "type": "Initialized", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:02Z" + }, + { + "type": "Ready", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:14Z" + }, + { + "type": "ContainersReady", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:14Z" + }, + { + "type": "PodScheduled", + "status": "True", + "lastTransitionTime": "2026-04-01T08:05:02Z" + } + ], + "containerStatuses": [ + { + "name": "coredns", + "ready": true, + "restartCount": 0, + "started": true, + "image": "registry.k8s.io/coredns/coredns:v1.11.1", + "containerId": "containerd://b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3d4e5f6a7b2c3", + "state": { + "running": { + "startedAt": "2026-04-01T08:05:13Z" + } + } + } + ] + }, + "events": [ + { + "type": "Normal", + "reason": "Scheduled", + "age": "58d", + "from": "default-scheduler", + "message": "Successfully assigned kube-system/coredns-5d78c9869d-r4pzt to aks-nodepool1-12345678-1" + }, + { + "type": "Normal", + "reason": "Pulled", + "age": "58d", + "from": "kubelet", + "message": "Container image \"registry.k8s.io/coredns/coredns:v1.11.1\" already present on machine" + } + ], + "attachedToExtension": "azure-kube-inventory" + } + }, + { + "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubernetesResources/deployment-nginx-default", + "name": "deployment-nginx-default", + "type": "Microsoft.KubernetesConfiguration/kubernetesResources", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-01T10:00:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-01T10:00:00.000Z" + }, + "properties": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "nginx", + "namespaceName": "default", + "uid": "b1c2d3e4-f5a6-7890-bcde-f12345678901", + "resourceVersion": "2234567", + "generation": 3, + "creationTimestamp": "2026-04-15T09:00:00Z", + "labels": [ + { + "name": "app", + "value": "nginx" + } + ] + }, + "spec": { + "replicas": 3, + "selector": [ + { + "name": "app", + "value": "nginx" + } + ], + "strategyType": "RollingUpdate", + "maxUnavailable": "25%", + "maxSurge": "25%", + "containers": [ + { + "name": "nginx", + "image": "nginx:1.25.4", + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "name": "http", + "containerPort": 80, + "protocol": "TCP" + } + ], + "resources": { + "requests": { + "cpu": "100m", + "memory": "128Mi" + }, + "limits": { + "cpu": "500m", + "memory": "512Mi" + } + } + } + ] + }, + "status": { + "replicas": 3, + "readyReplicas": 3, + "availableReplicas": 3, + "updatedReplicas": 3, + "unavailableReplicas": 0, + "observedGeneration": 3, + "conditions": [ + { + "type": "Available", + "status": "True", + "reason": "MinimumReplicasAvailable", + "message": "Deployment has minimum availability.", + "lastTransitionTime": "2026-04-15T09:00:20Z" + }, + { + "type": "Progressing", + "status": "True", + "reason": "NewReplicaSetAvailable", + "message": "ReplicaSet has successfully progressed.", + "lastTransitionTime": "2026-04-15T09:00:20Z" + } + ] + }, + "events": [], + "attachedToExtension": "azure-kube-inventory" + } + } + ], + "nextLink": null + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/tspconfig.yaml b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/tspconfig.yaml new file mode 100644 index 000000000000..0a826b08d4f7 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/KubernetesResources/tspconfig.yaml @@ -0,0 +1,50 @@ +parameters: + "service-dir": + default: "sdk/kubernetesresources" +emit: + - "@azure-tools/typespec-autorest" +options: + "@azure-tools/typespec-autorest": + omit-unreachable-types: false + emitter-output-dir: "{project-root}" + output-file: "{version-status}/{version}/KubernetesResources.json" + arm-types-dir: "{project-root}/../../../../common-types/resource-management" + emit-lro-options: "all" + examples-dir: "{project-root}/examples" + "@azure-tools/typespec-python": + service-dir: sdk/kubernetesconfiguration + emitter-output-dir: "{output-dir}/{service-dir}/azure-mgmt-kubernetesconfiguration-kubernetesresources" + namespace: "azure.mgmt.kubernetesconfiguration.kubernetesresources" + generate-test: true + generate-sample: true + flavor: "azure" + "@azure-tools/typespec-java": + service-dir: sdk/kubernetesconfiguration + emitter-output-dir: "{output-dir}/{service-dir}/azure-resourcemanager-kubernetesconfiguration-kubernetesresources" + namespace: "com.azure.resourcemanager.kubernetesconfiguration.kubernetesresources" + service-name: "KubernetesResources" + flavor: azure + "@azure-tools/typespec-ts": + service-dir: sdk/kubernetesconfiguration + emitter-output-dir: "{output-dir}/{service-dir}/arm-kubernetesconfiguration-kubernetesresources" + flavor: "azure" + compatibility-lro: true + experimental-extensible-enums: true + package-details: + name: "@azure/arm-kubernetesconfiguration-kubernetesresources" + "@azure-tools/typespec-go": + service-dir: "sdk/resourcemanager/kubernetesconfiguration" + emitter-output-dir: "{output-dir}/{service-dir}/armkubernetesresources" + module: "github.com/Azure/azure-sdk-for-go/{service-dir}/armkubernetesresources" + fix-const-stuttering: true + flavor: "azure" + generate-samples: true + generate-fakes: true + head-as-boolean: true + inject-spans: true + "@azure-typespec/http-client-csharp-mgmt": + namespace: "Azure.ResourceManager.KubernetesConfiguration.KubernetesResources" + emitter-output-dir: "{output-dir}/sdk/kubernetesconfiguration/{namespace}" +linter: + extends: + - "@azure-tools/typespec-azure-rulesets/resource-manager" diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2025-03-01/ListAsyncOperationStatus.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2025-03-01/ListAsyncOperationStatus.json index 17878d29efaa..ec40c3272c5d 100644 --- a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2025-03-01/ListAsyncOperationStatus.json +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2025-03-01/ListAsyncOperationStatus.json @@ -1,11 +1,11 @@ { "parameters": { - "subscriptionId": "subId1", - "resourceGroupName": "rg1", - "clusterRp": "Microsoft.Kubernetes", - "clusterResourceName": "connectedClusters", "api-version": "2025-03-01", - "clusterName": "clusterName1" + "clusterName": "clusterName1", + "clusterResourceName": "connectedClusters", + "clusterRp": "Microsoft.Kubernetes", + "resourceGroupName": "rg1", + "subscriptionId": "subId1" }, "responses": { "200": { @@ -14,22 +14,17 @@ { "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/ClusterMonitor/operations/99999999-9999-9999-9999-999999999999", "name": "99999999-9999-9999-9999-999999999999", - "status": "Deleting", - "properties": {}, - "error": null + "status": "Deleting" }, { "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/cassandraExtension1/operations/88888888-8888-8888-8888-888888888888", "name": "88888888-8888-8888-8888-888888888888", - "status": "Creating", - "properties": {}, - "error": null + "status": "Creating" } - ], - "nextLink": null + ] } } }, "operationId": "OperationStatus_List", - "title": "List Async Operation Status" + "title": "AsyncOperationStatus List" } diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2025-04-01/ListAsyncOperationStatus.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2025-04-01/ListAsyncOperationStatus.json index 2aed71b9b35e..2f7349c0b11b 100644 --- a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2025-04-01/ListAsyncOperationStatus.json +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2025-04-01/ListAsyncOperationStatus.json @@ -10,20 +10,15 @@ "responses": { "200": { "body": { - "nextLink": null, "value": [ { - "name": "99999999-9999-9999-9999-999999999999", - "error": null, "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/ClusterMonitor/operations/99999999-9999-9999-9999-999999999999", - "properties": {}, + "name": "99999999-9999-9999-9999-999999999999", "status": "Deleting" }, { - "name": "88888888-8888-8888-8888-888888888888", - "error": null, "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/cassandraExtension1/operations/88888888-8888-8888-8888-888888888888", - "properties": {}, + "name": "88888888-8888-8888-8888-888888888888", "status": "Creating" } ] diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2026-06-15-preview/ListAsyncOperationStatus.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2026-06-15-preview/ListAsyncOperationStatus.json new file mode 100644 index 000000000000..844499182077 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2026-06-15-preview/ListAsyncOperationStatus.json @@ -0,0 +1,30 @@ +{ + "parameters": { + "api-version": "2026-06-15-preview", + "clusterName": "clusterName1", + "clusterResourceName": "connectedClusters", + "clusterRp": "Microsoft.Kubernetes", + "resourceGroupName": "rg1", + "subscriptionId": "00000000-0000-0000-0000-000000000001" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000001/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/ClusterMonitor/operations/99999999-9999-9999-9999-999999999999", + "name": "99999999-9999-9999-9999-999999999999", + "status": "Deleting" + }, + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000001/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/cassandraExtension1/operations/88888888-8888-8888-8888-888888888888", + "name": "88888888-8888-8888-8888-888888888888", + "status": "Creating" + } + ] + } + } + }, + "operationId": "OperationStatus_List", + "title": "AsyncOperationStatus List" +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2026-06-15-preview/OperationsList.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2026-06-15-preview/OperationsList.json new file mode 100644 index 000000000000..156c6b70497b --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/examples/2026-06-15-preview/OperationsList.json @@ -0,0 +1,180 @@ +{ + "parameters": { + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "name": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/write", + "display": { + "description": "Creates or updates source control configuration.", + "operation": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/write", + "provider": "Microsoft Kubernetes Configuration", + "resource": "Microsoft.KubernetesConfiguration/sourceControlConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/read", + "display": { + "description": "Gets source control configuration.", + "operation": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/read", + "provider": "Microsoft Kubernetes Configuration", + "resource": "Microsoft.KubernetesConfiguration/sourceControlConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/delete", + "display": { + "description": "Deletes source control configuration.", + "operation": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/delete", + "provider": "Microsoft Kubernetes Configuration", + "resource": "Microsoft.KubernetesConfiguration/sourceControlConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/extensions/read", + "display": { + "description": "Get the specified Extension.", + "operation": "Get extension", + "provider": "Microsoft KubernetesConfiguration", + "resource": "extensions" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/extensions/write", + "display": { + "description": "Create the Extension specified.", + "operation": "Create a Extension", + "provider": "Microsoft KubernetesConfiguration", + "resource": "extensions" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/extensions/delete", + "display": { + "description": "Delete the specified Extension.", + "operation": "Delete Extension", + "provider": "Microsoft KubernetesConfiguration", + "resource": "extensions" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/extensions/operations/read", + "display": { + "description": "Get the Status of the Extension Async Operation.", + "operation": "Get Extension Async Operation Status", + "provider": "Microsoft KubernetesConfiguration", + "resource": "extensions" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/fluxConfigurations/read", + "display": { + "description": "Get the specified Flux Configuration.", + "operation": "Get fluxConfiguration", + "provider": "Microsoft KubernetesConfiguration", + "resource": "fluxConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/fluxConfigurations/write", + "display": { + "description": "Create the Flux Configuration specified.", + "operation": "Create a fluxConfiguration", + "provider": "Microsoft KubernetesConfiguration", + "resource": "fluxConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/fluxConfigurations/delete", + "display": { + "description": "Delete the specified Flux Configuration.", + "operation": "Delete Flux Configuration", + "provider": "Microsoft KubernetesConfiguration", + "resource": "fluxConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/fluxConfigurations/operations/read", + "display": { + "description": "Get the Status of the Flux Configuration Async Operation.", + "operation": "Get Flux Configuration Async Operation Status", + "provider": "Microsoft KubernetesConfiguration", + "resource": "fluxConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/register/action", + "display": { + "description": "Registers subscription to Microsoft.KubernetesConfiguration resource provider.", + "operation": "Microsoft.KubernetesConfiguration/register/action", + "provider": "Microsoft Kubernetes Configuration", + "resource": "Register" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/extensionTypes/read", + "display": { + "description": "Get Kubernetes Configuration Available Extensions", + "operation": "Microsoft.KubernetesConfiguration/extensionTypes/read", + "provider": "Microsoft KubernetesConfiguration", + "resource": "extensionTypes" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/kubernetesResources/read", + "display": { + "description": "Get the specified Kubernetes Resource inventory item.", + "operation": "Get kubernetesResources", + "provider": "Microsoft KubernetesConfiguration", + "resource": "kubernetesResources" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/upgradeAssessments/read", + "display": { + "description": "Get the specified Upgrade Assessment for a cluster.", + "operation": "Get upgradeAssessments", + "provider": "Microsoft KubernetesConfiguration", + "resource": "upgradeAssessments" + }, + "isDataAction": false, + "origin": "user,system" + } + ] + } + } + }, + "operationId": "Operations_List", + "title": "BatchAccountDelete" +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/main.tsp b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/main.tsp index c51a9ccc7b1e..2a74738c6192 100644 --- a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/main.tsp +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/main.tsp @@ -27,8 +27,6 @@ using TypeSpec.Versioning; @armProviderNamespace @service(#{ title: "OperationsClient" }) @versioned(Versions) -// FIXME: Common type version v2 is not supported for now. Set to v3. -@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v3) namespace Microsoft.KubernetesConfiguration; /** @@ -44,11 +42,29 @@ enum Versions { * The 2025-04-01 API version. */ v2025_04_01: "2025-04-01", + + /** + * The 2026-06-15-preview API version. + */ + v2026_06_15_preview: "2026-06-15-preview", } +@@armCommonTypesVersion( + Versions.v2025_03_01, + Azure.ResourceManager.CommonTypes.Versions.v3 +); +@@armCommonTypesVersion( + Versions.v2025_04_01, + Azure.ResourceManager.CommonTypes.Versions.v3 +); +@@armCommonTypesVersion( + Versions.v2026_06_15_preview, + Azure.ResourceManager.CommonTypes.Versions.v6 +); + interface Operations extends Azure.ResourceManager.Legacy.Operations< - ArmResponse, + ArmResponse, ErrorResponse > {} @@doc( diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/models.tsp b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/models.tsp index 5217c54b859d..3c62700128a6 100644 --- a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/models.tsp +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/models.tsp @@ -6,30 +6,11 @@ import "@azure-tools/typespec-azure-resource-manager"; using TypeSpec.Rest; using TypeSpec.Http; using Azure.ResourceManager; +using Azure.ResourceManager.CommonTypes; using Azure.ResourceManager.Foundations; namespace Microsoft.KubernetesConfiguration; -/** - * Result of the request to list operations. - */ -model ResourceProviderOperationList { - /** - * List of operations supported by this resource provider. - */ - @visibility(Lifecycle.Read) - @identifiers(#["name"]) - @pageItems - value?: ResourceProviderOperation[]; - - /** - * URL to the next set of results, if any. - */ - @nextLink - @visibility(Lifecycle.Read) - nextLink?: string; -} - /** * The async operations in progress, in the cluster. */ @@ -39,7 +20,7 @@ model OperationStatusList { */ @pageItems @visibility(Lifecycle.Read) - value?: OperationStatusResult[]; + value?: Azure.ResourceManager.CommonTypes.OperationStatusResult[]; /** * URL to get the next set of Operation Result objects, if any. @@ -48,89 +29,3 @@ model OperationStatusList { @visibility(Lifecycle.Read) nextLink?: string; } - -/** - * The current status of an async operation. - */ -model OperationStatusResult { - /** - * Fully qualified ID for the async operation. - */ - id?: string; - - /** - * Name of the async operation. - */ - name?: string; - - /** - * Operation status. - */ - status: string; - - /** - * Additional information, if available. - */ - #suppress "@azure-tools/typespec-azure-resource-manager/arm-no-record" "FIXME: Update justification, follow aka.ms/tsp/conversion-fix for details" - #suppress "@azure-tools/typespec-azure-core/no-nullable" "FIXME: Update justification, follow aka.ms/tsp/conversion-fix for details" - properties?: Record | null; - - /** - * If present, details of the operation error. - */ - #suppress "@azure-tools/typespec-azure-core/no-nullable" "FIXME: Update justification, follow aka.ms/tsp/conversion-fix for details" - @visibility(Lifecycle.Read) - error?: Azure.ResourceManager.CommonTypes.ErrorDetail | null; -} - -/** - * Supported operation of this resource provider. - */ -model ResourceProviderOperation { - /** - * Operation name, in format of {provider}/{resource}/{operation} - */ - name?: string; - - /** - * Display metadata associated with the operation. - */ - display?: ResourceProviderOperationDisplay; - - /** - * The flag that indicates whether the operation applies to data plane. - */ - @visibility(Lifecycle.Read) - isDataAction?: boolean; - - /** - * Origin of the operation - */ - @visibility(Lifecycle.Read) - origin?: string; -} - -/** - * Display metadata associated with the operation. - */ -model ResourceProviderOperationDisplay { - /** - * Resource provider: Microsoft KubernetesConfiguration. - */ - provider?: string; - - /** - * Resource on which the operation is performed. - */ - resource?: string; - - /** - * Type of operation: get, read, delete, etc. - */ - operation?: string; - - /** - * Description of this operation. - */ - description?: string; -} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/examples/ListAsyncOperationStatus.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/examples/ListAsyncOperationStatus.json new file mode 100644 index 000000000000..c701c982a124 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/examples/ListAsyncOperationStatus.json @@ -0,0 +1,30 @@ +{ + "parameters": { + "api-version": "2026-06-15-preview", + "clusterName": "clusterName1", + "clusterResourceName": "connectedClusters", + "clusterRp": "Microsoft.Kubernetes", + "resourceGroupName": "rg1", + "subscriptionId": "00000000-0000-0000-0000-000000000001" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000001/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/ClusterMonitor/operations/99999999-9999-9999-9999-999999999999", + "name": "99999999-9999-9999-9999-999999999999", + "status": "Deleting" + }, + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000001/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/cassandraExtension1/operations/88888888-8888-8888-8888-888888888888", + "name": "88888888-8888-8888-8888-888888888888", + "status": "Creating" + } + ] + } + } + }, + "operationId": "OperationStatus_List", + "title": "AsyncOperationStatus List" +} \ No newline at end of file diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/examples/OperationsList.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/examples/OperationsList.json new file mode 100644 index 000000000000..156c6b70497b --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/examples/OperationsList.json @@ -0,0 +1,180 @@ +{ + "parameters": { + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "name": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/write", + "display": { + "description": "Creates or updates source control configuration.", + "operation": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/write", + "provider": "Microsoft Kubernetes Configuration", + "resource": "Microsoft.KubernetesConfiguration/sourceControlConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/read", + "display": { + "description": "Gets source control configuration.", + "operation": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/read", + "provider": "Microsoft Kubernetes Configuration", + "resource": "Microsoft.KubernetesConfiguration/sourceControlConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/delete", + "display": { + "description": "Deletes source control configuration.", + "operation": "Microsoft.KubernetesConfiguration/sourceControlConfigurations/delete", + "provider": "Microsoft Kubernetes Configuration", + "resource": "Microsoft.KubernetesConfiguration/sourceControlConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/extensions/read", + "display": { + "description": "Get the specified Extension.", + "operation": "Get extension", + "provider": "Microsoft KubernetesConfiguration", + "resource": "extensions" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/extensions/write", + "display": { + "description": "Create the Extension specified.", + "operation": "Create a Extension", + "provider": "Microsoft KubernetesConfiguration", + "resource": "extensions" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/extensions/delete", + "display": { + "description": "Delete the specified Extension.", + "operation": "Delete Extension", + "provider": "Microsoft KubernetesConfiguration", + "resource": "extensions" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/extensions/operations/read", + "display": { + "description": "Get the Status of the Extension Async Operation.", + "operation": "Get Extension Async Operation Status", + "provider": "Microsoft KubernetesConfiguration", + "resource": "extensions" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/fluxConfigurations/read", + "display": { + "description": "Get the specified Flux Configuration.", + "operation": "Get fluxConfiguration", + "provider": "Microsoft KubernetesConfiguration", + "resource": "fluxConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/fluxConfigurations/write", + "display": { + "description": "Create the Flux Configuration specified.", + "operation": "Create a fluxConfiguration", + "provider": "Microsoft KubernetesConfiguration", + "resource": "fluxConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/fluxConfigurations/delete", + "display": { + "description": "Delete the specified Flux Configuration.", + "operation": "Delete Flux Configuration", + "provider": "Microsoft KubernetesConfiguration", + "resource": "fluxConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/fluxConfigurations/operations/read", + "display": { + "description": "Get the Status of the Flux Configuration Async Operation.", + "operation": "Get Flux Configuration Async Operation Status", + "provider": "Microsoft KubernetesConfiguration", + "resource": "fluxConfigurations" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/register/action", + "display": { + "description": "Registers subscription to Microsoft.KubernetesConfiguration resource provider.", + "operation": "Microsoft.KubernetesConfiguration/register/action", + "provider": "Microsoft Kubernetes Configuration", + "resource": "Register" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/extensionTypes/read", + "display": { + "description": "Get Kubernetes Configuration Available Extensions", + "operation": "Microsoft.KubernetesConfiguration/extensionTypes/read", + "provider": "Microsoft KubernetesConfiguration", + "resource": "extensionTypes" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/kubernetesResources/read", + "display": { + "description": "Get the specified Kubernetes Resource inventory item.", + "operation": "Get kubernetesResources", + "provider": "Microsoft KubernetesConfiguration", + "resource": "kubernetesResources" + }, + "isDataAction": false, + "origin": "user,system" + }, + { + "name": "Microsoft.KubernetesConfiguration/upgradeAssessments/read", + "display": { + "description": "Get the specified Upgrade Assessment for a cluster.", + "operation": "Get upgradeAssessments", + "provider": "Microsoft KubernetesConfiguration", + "resource": "upgradeAssessments" + }, + "isDataAction": false, + "origin": "user,system" + } + ] + } + } + }, + "operationId": "Operations_List", + "title": "BatchAccountDelete" +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/operations.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/operations.json new file mode 100644 index 000000000000..22cd4ef3b27e --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/operations.json @@ -0,0 +1,172 @@ +{ + "swagger": "2.0", + "info": { + "title": "OperationsClient", + "version": "2026-06-15-preview", + "description": "Use these APIs to create extension resources through ARM, for Kubernetes Clusters.", + "x-typespec-generated": [ + { + "emitter": "@azure-tools/typespec-autorest" + } + ] + }, + "schemes": [ + "https" + ], + "host": "management.azure.com", + "produces": [ + "application/json" + ], + "consumes": [ + "application/json" + ], + "security": [ + { + "azure_auth": [ + "user_impersonation" + ] + } + ], + "securityDefinitions": { + "azure_auth": { + "type": "oauth2", + "description": "Azure Active Directory OAuth2 Flow.", + "flow": "implicit", + "authorizationUrl": "https://login.microsoftonline.com/common/oauth2/authorize", + "scopes": { + "user_impersonation": "impersonate your user account" + } + } + }, + "tags": [ + { + "name": "Operations" + }, + { + "name": "Operations in a Cluster" + } + ], + "paths": { + "/providers/Microsoft.KubernetesConfiguration/operations": { + "get": { + "operationId": "Operations_List", + "tags": [ + "Operations" + ], + "description": "List all the available operations the KubernetesConfiguration resource provider supports.", + "parameters": [ + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/definitions/OperationListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-examples": { + "BatchAccountDelete": { + "$ref": "./examples/OperationsList.json" + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{clusterRp}/{clusterResourceName}/{clusterName}/providers/Microsoft.KubernetesConfiguration/operations": { + "get": { + "operationId": "OperationStatus_List", + "tags": [ + "Operations in a Cluster" + ], + "description": "List Async Operations, currently in progress, in a cluster", + "parameters": [ + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "clusterRp", + "in": "path", + "description": "The Kubernetes cluster RP - i.e. Microsoft.ContainerService, Microsoft.Kubernetes, Microsoft.HybridContainerService.", + "required": true, + "type": "string" + }, + { + "name": "clusterResourceName", + "in": "path", + "description": "The Kubernetes cluster resource name - i.e. managedClusters, connectedClusters, provisionedClusters, appliances.", + "required": true, + "type": "string" + }, + { + "name": "clusterName", + "in": "path", + "description": "The name of the kubernetes cluster.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "schema": { + "$ref": "#/definitions/OperationStatusList" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-examples": { + "AsyncOperationStatus List": { + "$ref": "./examples/ListAsyncOperationStatus.json" + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + } + }, + "definitions": { + "OperationStatusList": { + "type": "object", + "description": "The async operations in progress, in the cluster.", + "properties": { + "value": { + "type": "array", + "description": "List of async operations in progress, in the cluster.", + "items": { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/definitions/OperationStatusResult" + }, + "readOnly": true + }, + "nextLink": { + "type": "string", + "description": "URL to get the next set of Operation Result objects, if any.", + "readOnly": true + } + } + } + }, + "parameters": {} +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/readme.md b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/readme.md index 343cf7d7893e..6eacac5fd3bc 100644 --- a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/readme.md +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/readme.md @@ -24,7 +24,7 @@ For other options on installation see [Installing AutoRest](https://aka.ms/autor These are the global settings for the operations in KubernetesConfiguration. -``` yaml +```yaml title: OperationsClient description: Operations Client openapi-type: arm @@ -33,26 +33,50 @@ tag: package-2025-04 --- +### Tag: package-preview-2026-06 + +These settings apply only when `--tag=package-preview-2026-06` is specified on the command line. + +```yaml $(tag) == 'package-preview-2026-06' +input-file: + - preview/2026-06-15-preview/operations.json +suppressions: + - code: OperationsApiSchemaUsesCommonTypes + from: operations.json + reason: Existing service contract needs to be backward compatible. + - code: OperationsApiTenantLevelOnly + from: operations.json + reason: Existing service contract needs to be backward compatible. + - code: ResourceNameRestriction + from: operations.json + reason: Existing service contract needs to be backward compatible. + - code: OperationsApiResponseSchema + from: operations.json + reason: Existing service contract needs to be backward compatible. +``` + +--- + ### Tag: package-2025-04 These settings apply only when `--tag=package-2025-04` is specified on the command line. -``` yaml $(tag) == 'package-2025-04' +```yaml $(tag) == 'package-2025-04' input-file: - stable/2025-04-01/operations.json suppressions: - code: OperationsApiSchemaUsesCommonTypes from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. - code: OperationsApiTenantLevelOnly from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. - code: ResourceNameRestriction from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. - code: OperationsApiResponseSchema from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. ``` --- @@ -61,22 +85,22 @@ suppressions: These settings apply only when `--tag=package-2025-03` is specified on the command line. -``` yaml $(tag) == 'package-2025-03' +```yaml $(tag) == 'package-2025-03' input-file: - stable/2025-03-01/operations.json suppressions: - code: OperationsApiSchemaUsesCommonTypes from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. - code: OperationsApiTenantLevelOnly from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. - code: ResourceNameRestriction from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. - code: OperationsApiResponseSchema from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. ``` --- @@ -85,21 +109,20 @@ suppressions: These settings apply only when `--tag=package-2024-11` is specified on the command line. -``` yaml $(tag) == 'package-2024-11' +```yaml $(tag) == 'package-2024-11' input-file: - stable/2024-11-01/operations.json suppressions: - code: OperationsApiSchemaUsesCommonTypes from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. - code: OperationsApiTenantLevelOnly from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. - code: ResourceNameRestriction from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. - code: OperationsApiResponseSchema from: operations.json - reason: Existing service contract needs to be backward compatible. + reason: Existing service contract needs to be backward compatible. ``` - diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-03-01/examples/ListAsyncOperationStatus.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-03-01/examples/ListAsyncOperationStatus.json index 17878d29efaa..c7113b780b01 100644 --- a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-03-01/examples/ListAsyncOperationStatus.json +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-03-01/examples/ListAsyncOperationStatus.json @@ -1,11 +1,11 @@ { "parameters": { - "subscriptionId": "subId1", - "resourceGroupName": "rg1", - "clusterRp": "Microsoft.Kubernetes", - "clusterResourceName": "connectedClusters", "api-version": "2025-03-01", - "clusterName": "clusterName1" + "clusterName": "clusterName1", + "clusterResourceName": "connectedClusters", + "clusterRp": "Microsoft.Kubernetes", + "resourceGroupName": "rg1", + "subscriptionId": "subId1" }, "responses": { "200": { @@ -14,22 +14,17 @@ { "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/ClusterMonitor/operations/99999999-9999-9999-9999-999999999999", "name": "99999999-9999-9999-9999-999999999999", - "status": "Deleting", - "properties": {}, - "error": null + "status": "Deleting" }, { "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/cassandraExtension1/operations/88888888-8888-8888-8888-888888888888", "name": "88888888-8888-8888-8888-888888888888", - "status": "Creating", - "properties": {}, - "error": null + "status": "Creating" } - ], - "nextLink": null + ] } } }, "operationId": "OperationStatus_List", - "title": "List Async Operation Status" -} + "title": "AsyncOperationStatus List" +} \ No newline at end of file diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-03-01/operations.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-03-01/operations.json index c245249e9236..6ba93bad07da 100644 --- a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-03-01/operations.json +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-03-01/operations.json @@ -63,7 +63,7 @@ "200": { "description": "Azure operation completed successfully.", "schema": { - "$ref": "#/definitions/ResourceProviderOperationList" + "$ref": "../../../../../../common-types/resource-management/v3/types.json#/definitions/OperationListResult" } }, "default": { @@ -137,7 +137,7 @@ } }, "x-ms-examples": { - "List Async Operation Status": { + "AsyncOperationStatus List": { "$ref": "./examples/ListAsyncOperationStatus.json" } }, @@ -156,7 +156,7 @@ "type": "array", "description": "List of async operations in progress, in the cluster.", "items": { - "$ref": "#/definitions/OperationStatusResult" + "$ref": "../../../../../../common-types/resource-management/v3/types.json#/definitions/OperationStatusResult" }, "readOnly": true }, @@ -166,109 +166,6 @@ "readOnly": true } } - }, - "OperationStatusResult": { - "type": "object", - "description": "The current status of an async operation.", - "properties": { - "id": { - "type": "string", - "description": "Fully qualified ID for the async operation." - }, - "name": { - "type": "string", - "description": "Name of the async operation." - }, - "status": { - "type": "string", - "description": "Operation status." - }, - "properties": { - "type": "object", - "description": "Additional information, if available.", - "x-nullable": true, - "additionalProperties": { - "type": "string" - } - }, - "error": { - "$ref": "../../../../../../common-types/resource-management/v3/types.json#/definitions/ErrorDetail", - "description": "If present, details of the operation error.", - "x-nullable": true, - "readOnly": true - } - }, - "required": [ - "status" - ] - }, - "ResourceProviderOperation": { - "type": "object", - "description": "Supported operation of this resource provider.", - "properties": { - "name": { - "type": "string", - "description": "Operation name, in format of {provider}/{resource}/{operation}" - }, - "display": { - "$ref": "#/definitions/ResourceProviderOperationDisplay", - "description": "Display metadata associated with the operation." - }, - "isDataAction": { - "type": "boolean", - "description": "The flag that indicates whether the operation applies to data plane.", - "readOnly": true - }, - "origin": { - "type": "string", - "description": "Origin of the operation", - "readOnly": true - } - } - }, - "ResourceProviderOperationDisplay": { - "type": "object", - "description": "Display metadata associated with the operation.", - "properties": { - "provider": { - "type": "string", - "description": "Resource provider: Microsoft KubernetesConfiguration." - }, - "resource": { - "type": "string", - "description": "Resource on which the operation is performed." - }, - "operation": { - "type": "string", - "description": "Type of operation: get, read, delete, etc." - }, - "description": { - "type": "string", - "description": "Description of this operation." - } - } - }, - "ResourceProviderOperationList": { - "type": "object", - "description": "Result of the request to list operations.", - "properties": { - "value": { - "type": "array", - "description": "List of operations supported by this resource provider.", - "items": { - "$ref": "#/definitions/ResourceProviderOperation" - }, - "readOnly": true, - "x-ms-identifiers": [ - "name" - ] - }, - "nextLink": { - "type": "string", - "description": "URL to the next set of results, if any.", - "readOnly": true - } - } } }, "parameters": {} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-04-01/examples/ListAsyncOperationStatus.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-04-01/examples/ListAsyncOperationStatus.json index 2aed71b9b35e..4f6d94cf093c 100644 --- a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-04-01/examples/ListAsyncOperationStatus.json +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-04-01/examples/ListAsyncOperationStatus.json @@ -10,20 +10,15 @@ "responses": { "200": { "body": { - "nextLink": null, "value": [ { - "name": "99999999-9999-9999-9999-999999999999", - "error": null, "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/ClusterMonitor/operations/99999999-9999-9999-9999-999999999999", - "properties": {}, + "name": "99999999-9999-9999-9999-999999999999", "status": "Deleting" }, { - "name": "88888888-8888-8888-8888-888888888888", - "error": null, "id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/extensions/cassandraExtension1/operations/88888888-8888-8888-8888-888888888888", - "properties": {}, + "name": "88888888-8888-8888-8888-888888888888", "status": "Creating" } ] @@ -32,4 +27,4 @@ }, "operationId": "OperationStatus_List", "title": "AsyncOperationStatus List" -} +} \ No newline at end of file diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-04-01/operations.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-04-01/operations.json index f799553a22dc..df55b6e2eaad 100644 --- a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-04-01/operations.json +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/operations/stable/2025-04-01/operations.json @@ -63,7 +63,7 @@ "200": { "description": "Azure operation completed successfully.", "schema": { - "$ref": "#/definitions/ResourceProviderOperationList" + "$ref": "../../../../../../common-types/resource-management/v3/types.json#/definitions/OperationListResult" } }, "default": { @@ -156,7 +156,7 @@ "type": "array", "description": "List of async operations in progress, in the cluster.", "items": { - "$ref": "#/definitions/OperationStatusResult" + "$ref": "../../../../../../common-types/resource-management/v3/types.json#/definitions/OperationStatusResult" }, "readOnly": true }, @@ -166,109 +166,6 @@ "readOnly": true } } - }, - "OperationStatusResult": { - "type": "object", - "description": "The current status of an async operation.", - "properties": { - "id": { - "type": "string", - "description": "Fully qualified ID for the async operation." - }, - "name": { - "type": "string", - "description": "Name of the async operation." - }, - "status": { - "type": "string", - "description": "Operation status." - }, - "properties": { - "type": "object", - "description": "Additional information, if available.", - "x-nullable": true, - "additionalProperties": { - "type": "string" - } - }, - "error": { - "$ref": "../../../../../../common-types/resource-management/v3/types.json#/definitions/ErrorDetail", - "description": "If present, details of the operation error.", - "x-nullable": true, - "readOnly": true - } - }, - "required": [ - "status" - ] - }, - "ResourceProviderOperation": { - "type": "object", - "description": "Supported operation of this resource provider.", - "properties": { - "name": { - "type": "string", - "description": "Operation name, in format of {provider}/{resource}/{operation}" - }, - "display": { - "$ref": "#/definitions/ResourceProviderOperationDisplay", - "description": "Display metadata associated with the operation." - }, - "isDataAction": { - "type": "boolean", - "description": "The flag that indicates whether the operation applies to data plane.", - "readOnly": true - }, - "origin": { - "type": "string", - "description": "Origin of the operation", - "readOnly": true - } - } - }, - "ResourceProviderOperationDisplay": { - "type": "object", - "description": "Display metadata associated with the operation.", - "properties": { - "provider": { - "type": "string", - "description": "Resource provider: Microsoft KubernetesConfiguration." - }, - "resource": { - "type": "string", - "description": "Resource on which the operation is performed." - }, - "operation": { - "type": "string", - "description": "Type of operation: get, read, delete, etc." - }, - "description": { - "type": "string", - "description": "Description of this operation." - } - } - }, - "ResourceProviderOperationList": { - "type": "object", - "description": "Result of the request to list operations.", - "properties": { - "value": { - "type": "array", - "description": "List of operations supported by this resource provider.", - "items": { - "$ref": "#/definitions/ResourceProviderOperation" - }, - "readOnly": true, - "x-ms-identifiers": [ - "name" - ] - }, - "nextLink": { - "type": "string", - "description": "URL to the next set of results, if any.", - "readOnly": true - } - } } }, "parameters": {} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/UpgradeAssessment.tsp b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/UpgradeAssessment.tsp new file mode 100644 index 000000000000..e256a4e4a308 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/UpgradeAssessment.tsp @@ -0,0 +1,94 @@ +import "@azure-tools/typespec-azure-core"; +import "@azure-tools/typespec-azure-resource-manager"; +import "@typespec/rest"; +import "./models.tsp"; + +using TypeSpec.Rest; +using Azure.Core; +using Azure.ResourceManager; +using Azure.ResourceManager.Foundations; +using TypeSpec.Http; + +namespace Microsoft.KubernetesConfiguration; + +/** + * ARM resource representing a Kubernetes cluster upgrade assessment. + */ +model UpgradeAssessment + is Azure.ResourceManager.ProxyResource { + ...ResourceNameParameter< + Resource = UpgradeAssessment, + KeyName = "upgradeAssessmentName", + SegmentName = "upgradeAssessments", + NamePattern = "^[a-z]([a-z0-9._-]{0,126}[a-z0-9])?$" + >; +} + +/** + * Operations alias for UpgradeAssessments using the cluster extension routing pattern. + * Generates URLs of the form: + * /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{clusterRp}/{clusterResourceName}/{clusterName}/providers/Microsoft.KubernetesConfiguration/upgradeAssessments[/{upgradeAssessmentName}] + */ +alias UpgradeAssessmentOps = Azure.ResourceManager.Legacy.ExtensionOperations< + { + ...ApiVersionParameter; + ...SubscriptionIdParameter; + ...ResourceGroupParameter; + + /** + * The Kubernetes cluster RP - i.e. Microsoft.ContainerService, Microsoft.Kubernetes, + * Microsoft.HybridContainerService, Microsoft.KubernetesConfiguration. + */ + @path + @segment("providers") + @key + @pattern("^Microsoft\\.(ContainerService|Kubernetes|HybridContainerService|KubernetesConfiguration)$") + clusterRp: string; + + /** + * The Kubernetes cluster resource name - i.e. managedClusters, connectedClusters, + * provisionedClusters, appliances. + */ + @key + @path + @pattern("^[a-zA-Z]+$") + clusterResourceName: string; + + /** + * The name of the kubernetes cluster. + */ + @key + @path + @pattern("^[a-zA-Z0-9][a-zA-Z0-9-_.]{0,62}$") + clusterName: string; + }, + { + ...Azure.ResourceManager.Extension.ExtensionProviderNamespace; + ...ParentKeysOf; + }, + { + ...Azure.ResourceManager.Extension.ExtensionProviderNamespace; + ...KeysOf; + } +>; + +@armResourceOperations(#{ allowStaticRoutes: true, omitTags: true }) +interface UpgradeAssessments { + /** + * Get the upgrade assessment for a cluster. + */ + @tag("UpgradeAssessments") + get is UpgradeAssessmentOps.Read; + + /** + * List upgrade assessments for the cluster. + */ + @tag("UpgradeAssessments") + list is UpgradeAssessmentOps.List; +} + +@@doc(UpgradeAssessment.name, "Name of the UpgradeAssessments resource."); +@@doc( + UpgradeAssessment.properties, + "Properties of the UpgradeAssessments resource." +); diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/examples/2026-06-15-preview/GetUpgradeAssessments.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/examples/2026-06-15-preview/GetUpgradeAssessments.json new file mode 100644 index 000000000000..f6118b78ef00 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/examples/2026-06-15-preview/GetUpgradeAssessments.json @@ -0,0 +1,121 @@ +{ + "title": "Get Upgrade Assessment", + "operationId": "UpgradeAssessments_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "upgradeAssessmentName": "default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/00000000-0000-0000-0000-000000000001/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/upgradeAssessments/default", + "name": "default", + "type": "Microsoft.KubernetesConfiguration/upgradeAssessments", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-02T10:15:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-02T10:15:00.000Z" + }, + "properties": { + "currentKubernetesVersion": "1.27.9", + "targetKubernetesVersion": "1.30.0", + "assessmentTime": "2026-06-02T10:15:00Z", + "overallSeverity": "Critical", + "componentCompatibility": [ + { + "name": "kube-proxy", + "version": "1.27.9", + "compatibilityStatus": "Compatible", + "severity": "Pass" + }, + { + "name": "coredns", + "version": "1.10.1", + "compatibilityStatus": "Compatible", + "severity": "Pass" + }, + { + "name": "cert-manager", + "version": "1.8.0", + "compatibilityStatus": "Incompatible", + "severity": "Critical", + "minCompatibleVersion": "1.12.0", + "notes": "cert-manager v1.8.0 does not support Kubernetes 1.30+. Upgrade to >= 1.12.0." + }, + { + "name": "ingress-nginx", + "version": "1.2.1", + "compatibilityStatus": "Incompatible", + "severity": "Critical", + "minCompatibleVersion": "1.9.0", + "notes": "ingress-nginx v1.2.1 uses networking.k8s.io/v1beta1 which is removed in Kubernetes 1.29. Upgrade to >= 1.9.0." + } + ], + "deprecatedApis": [ + { + "group": "networking.k8s.io", + "version": "v1beta1", + "resource": "ingresses", + "removedRelease": "1.22", + "usageMetrics": { + "get": 142, + "list": 89, + "watch": 512, + "post": 3, + "put": 7 + }, + "lastUsageObservedAt": "2026-06-02T09:58:34Z", + "severity": "Critical" + }, + { + "group": "policy", + "version": "v1beta1", + "resource": "poddisruptionbudgets", + "removedRelease": "1.25", + "usageMetrics": { + "get": 54, + "list": 31, + "watch": 210 + }, + "lastUsageObservedAt": "2026-06-02T10:01:12Z", + "severity": "Critical" + } + ], + "readinessChecks": [ + { + "category": "APIServerHealth", + "severity": "Pass", + "details": "API server /healthz and /readyz endpoints responded successfully." + }, + { + "category": "NodeStatus", + "name": "aks-nodepool1-12345678-vmss000000", + "severity": "Pass", + "details": "Node is Ready. Kubelet version: v1.27.9." + }, + { + "category": "NodeStatus", + "name": "aks-nodepool1-12345678-vmss000001", + "severity": "Pass", + "details": "Node is Ready. Kubelet version: v1.27.9." + }, + { + "category": "PodDisruptionBudget", + "name": "default/my-app", + "severity": "Warning", + "details": "PodDisruptionBudget 'my-app' in namespace 'default' may block node drain during upgrade." + } + ] + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/examples/2026-06-15-preview/ListUpgradeAssessments.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/examples/2026-06-15-preview/ListUpgradeAssessments.json new file mode 100644 index 000000000000..11105254b318 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/examples/2026-06-15-preview/ListUpgradeAssessments.json @@ -0,0 +1,71 @@ +{ + "title": "List Upgrade Assessments", + "operationId": "UpgradeAssessments_List", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000001/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/upgradeAssessments/default", + "name": "default", + "type": "Microsoft.KubernetesConfiguration/upgradeAssessments", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-02T10:15:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-02T10:15:00.000Z" + }, + "properties": { + "currentKubernetesVersion": "1.27.9", + "targetKubernetesVersion": "1.30.0", + "assessmentTime": "2026-06-02T10:15:00Z", + "overallSeverity": "Critical", + "componentCompatibility": [ + { + "name": "kube-proxy", + "version": "1.27.9", + "compatibilityStatus": "Compatible", + "severity": "Pass" + }, + { + "name": "cert-manager", + "version": "1.8.0", + "compatibilityStatus": "Incompatible", + "severity": "Critical", + "minCompatibleVersion": "1.12.0", + "notes": "cert-manager v1.8.0 does not support Kubernetes 1.30+. Upgrade to >= 1.12.0." + } + ], + "deprecatedApis": [ + { + "group": "networking.k8s.io", + "version": "v1beta1", + "resource": "ingresses", + "removedRelease": "1.22", + "severity": "Critical" + } + ], + "readinessChecks": [ + { + "category": "APIServerHealth", + "severity": "Pass", + "details": "API server /healthz and /readyz endpoints responded successfully." + } + ] + } + } + ] + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/main.tsp b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/main.tsp new file mode 100644 index 000000000000..23a6f8ae333c --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/main.tsp @@ -0,0 +1,33 @@ +import "@typespec/rest"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-core"; +import "@azure-tools/typespec-azure-resource-manager"; +import "./models.tsp"; +import "./UpgradeAssessment.tsp"; + +using TypeSpec.Rest; +using TypeSpec.Http; +using Azure.ResourceManager.Foundations; +using Azure.Core; +using Azure.ResourceManager; +using TypeSpec.Versioning; + +/** + * APIs for cluster upgrade assessment resources under Microsoft.KubernetesConfiguration. + */ +#suppress "@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint" "UpgradeAssessments is a proxy resource provider under Microsoft.Kubernetes; no independent operations endpoint is registered." +@armProviderNamespace +@service(#{ title: "UpgradeAssessmentsClient" }) +@versioned(Versions) +@armCommonTypesVersion(Azure.ResourceManager.CommonTypes.Versions.v6) +namespace Microsoft.KubernetesConfiguration; + +/** + * The available API versions. + */ +enum Versions { + /** + * The 2026-06-15-preview API version. + */ + v2026_06_15_preview: "2026-06-15-preview", +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/models.tsp b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/models.tsp new file mode 100644 index 000000000000..b53f1519386c --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/models.tsp @@ -0,0 +1,208 @@ +import "@typespec/rest"; +import "@typespec/http"; +import "@typespec/versioning"; +import "@azure-tools/typespec-azure-resource-manager"; +import "@azure-tools/typespec-azure-core"; + +using TypeSpec.Rest; +using TypeSpec.Http; +using TypeSpec.Versioning; +using Azure.Core; +using Azure.ResourceManager; +using Azure.ResourceManager.Foundations; + +namespace Microsoft.KubernetesConfiguration; + +// ─── UpgradeAssessment enums ────────────────────────────────────────────────── + +/** Severity of an upgrade-assessment finding or readiness check. */ +union Severity { + string, + + /** No issues found. */ + Pass: "Pass", + + /** Non-blocking issues found; upgrade is possible but action is recommended. */ + Warning: "Warning", + + /** Blocking issues found; upgrade should not proceed without remediation. */ + Critical: "Critical", + + /** Severity could not be determined. */ + Unknown: "Unknown", +} + +/** Compatibility status of a cluster component with the target Kubernetes version. */ +union CompatibilityStatus { + string, + + /** Component is compatible with the target version. */ + Compatible: "Compatible", + + /** Compatibility with the target version has not been tested. */ + Untested: "Untested", + + /** Component is incompatible with the target version. */ + Incompatible: "Incompatible", + + /** Compatibility status is unknown. */ + Unknown: "Unknown", +} + +/** Category of a cluster readiness check. */ +union ReadinessCategory { + string, + + /** Node status check. */ + NodeStatus: "NodeStatus", + + /** API server health check. */ + APIServerHealth: "APIServerHealth", + + /** Pod disruption budget check. */ + PodDisruptionBudget: "PodDisruptionBudget", + + /** Addon compatibility check. */ + Addon: "Addon", + + /** Storage compatibility check. */ + Storage: "Storage", + + /** Networking compatibility check. */ + Networking: "Networking", +} + +// ─── UpgradeAssessment sub-models ───────────────────────────────────────────── + +/** Compatibility status of a single cluster component with the target Kubernetes version. */ +model ComponentCompatibility { + /** Component name (e.g., 'containerd', 'calico'). */ + name: string; + + /** Installed component version. */ + version: string; + + /** Compatibility of the component with the target Kubernetes version. */ + compatibilityStatus: CompatibilityStatus; + + /** Severity associated with this compatibility result. */ + severity: Severity; + + /** Minimum component version known to be compatible with targetKubernetesVersion. */ + minCompatibleVersion?: string; + + /** Additional notes about compatibility. */ + notes?: string; +} + +/** Observed call counts per HTTP verb for a deprecated Kubernetes API. */ +model HttpVerbUsageMetrics { + /** Number of GET requests observed. */ + get?: int64; + + /** Number of LIST requests observed. */ + list?: int64; + + /** Number of POST (create) requests observed. */ + post?: int64; + + /** Number of PUT (replace) requests observed. */ + put?: int64; + + /** Number of PATCH requests observed. */ + patch?: int64; + + /** Number of DELETE requests observed. */ + delete?: int64; + + /** Number of WATCH requests observed. */ + watch?: int64; +} + +/** A deprecated Kubernetes API still in use in the cluster. */ +model DeprecatedApiUsage { + /** API group (e.g., 'flowcontrol.apiserver.k8s.io'). */ + group: string; + + /** API version (e.g., 'v1beta3'). */ + version: string; + + /** Resource plural name (e.g., 'flowschemas'). */ + resource: string; + + /** Kubernetes release in which this API is removed (e.g., '1.32'). */ + removedRelease?: string; + + /** HTTP verb call counts observed for this deprecated API. */ + usageMetrics?: HttpVerbUsageMetrics; + + /** UTC timestamp of the last observed usage. */ + lastUsageObservedAt?: utcDateTime; + + /** Severity of continued use of this deprecated API. */ + severity: Severity; +} + +/** A single cluster readiness check result. */ +model ReadinessCheck { + /** Category of the readiness check. */ + category: ReadinessCategory; + + /** + * Subject of the check (node name, workload namespace/name, etc.). + * Optional for cluster-wide checks. + */ + name?: string; + + /** Severity of the check result. */ + severity: Severity; + + /** Human-readable reason when severity is not 'pass'. */ + details?: string; +} + +// ─── ARM resource properties ────────────────────────────────────────────────── + +/** Properties of a single UpgradeAssessment ARM resource. */ +#suppress "@azure-tools/typespec-azure-resource-manager/arm-resource-provisioning-state" "This resource does not have a provisioning state per the original Swagger design" +model UpgradeAssessmentProperties { + /** Current Kubernetes version running on the cluster (e.g., '1.29'). */ + @visibility(Lifecycle.Read) + currentKubernetesVersion?: string; + + /** Target Kubernetes version to evaluate for upgrade (e.g., '1.30'). */ + targetKubernetesVersion?: string; + + /** + * UTC timestamp when the in-cluster agent last computed this assessment. + */ + @visibility(Lifecycle.Read) + assessmentTime?: utcDateTime; + + /** + * Rolled-up severity across all checks; highest severity wins. + */ + @visibility(Lifecycle.Read) + overallSeverity?: Severity; + + /** + * Per-component compatibility results with the target Kubernetes version. + */ + @visibility(Lifecycle.Read) + @identifiers(#[]) + componentCompatibility?: ComponentCompatibility[]; + + /** + * Deprecated Kubernetes APIs still in use in the cluster. + */ + @visibility(Lifecycle.Read) + @identifiers(#[]) + deprecatedApis?: DeprecatedApiUsage[]; + + /** + * Cluster readiness check results. + */ + @visibility(Lifecycle.Read) + @identifiers(#[]) + readinessChecks?: ReadinessCheck[]; +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/examples/GetUpgradeAssessments.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/examples/GetUpgradeAssessments.json new file mode 100644 index 000000000000..f6118b78ef00 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/examples/GetUpgradeAssessments.json @@ -0,0 +1,121 @@ +{ + "title": "Get Upgrade Assessment", + "operationId": "UpgradeAssessments_Get", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "upgradeAssessmentName": "default", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "id": "/subscriptions/00000000-0000-0000-0000-000000000001/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/upgradeAssessments/default", + "name": "default", + "type": "Microsoft.KubernetesConfiguration/upgradeAssessments", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-02T10:15:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-02T10:15:00.000Z" + }, + "properties": { + "currentKubernetesVersion": "1.27.9", + "targetKubernetesVersion": "1.30.0", + "assessmentTime": "2026-06-02T10:15:00Z", + "overallSeverity": "Critical", + "componentCompatibility": [ + { + "name": "kube-proxy", + "version": "1.27.9", + "compatibilityStatus": "Compatible", + "severity": "Pass" + }, + { + "name": "coredns", + "version": "1.10.1", + "compatibilityStatus": "Compatible", + "severity": "Pass" + }, + { + "name": "cert-manager", + "version": "1.8.0", + "compatibilityStatus": "Incompatible", + "severity": "Critical", + "minCompatibleVersion": "1.12.0", + "notes": "cert-manager v1.8.0 does not support Kubernetes 1.30+. Upgrade to >= 1.12.0." + }, + { + "name": "ingress-nginx", + "version": "1.2.1", + "compatibilityStatus": "Incompatible", + "severity": "Critical", + "minCompatibleVersion": "1.9.0", + "notes": "ingress-nginx v1.2.1 uses networking.k8s.io/v1beta1 which is removed in Kubernetes 1.29. Upgrade to >= 1.9.0." + } + ], + "deprecatedApis": [ + { + "group": "networking.k8s.io", + "version": "v1beta1", + "resource": "ingresses", + "removedRelease": "1.22", + "usageMetrics": { + "get": 142, + "list": 89, + "watch": 512, + "post": 3, + "put": 7 + }, + "lastUsageObservedAt": "2026-06-02T09:58:34Z", + "severity": "Critical" + }, + { + "group": "policy", + "version": "v1beta1", + "resource": "poddisruptionbudgets", + "removedRelease": "1.25", + "usageMetrics": { + "get": 54, + "list": 31, + "watch": 210 + }, + "lastUsageObservedAt": "2026-06-02T10:01:12Z", + "severity": "Critical" + } + ], + "readinessChecks": [ + { + "category": "APIServerHealth", + "severity": "Pass", + "details": "API server /healthz and /readyz endpoints responded successfully." + }, + { + "category": "NodeStatus", + "name": "aks-nodepool1-12345678-vmss000000", + "severity": "Pass", + "details": "Node is Ready. Kubelet version: v1.27.9." + }, + { + "category": "NodeStatus", + "name": "aks-nodepool1-12345678-vmss000001", + "severity": "Pass", + "details": "Node is Ready. Kubelet version: v1.27.9." + }, + { + "category": "PodDisruptionBudget", + "name": "default/my-app", + "severity": "Warning", + "details": "PodDisruptionBudget 'my-app' in namespace 'default' may block node drain during upgrade." + } + ] + } + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/examples/ListUpgradeAssessments.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/examples/ListUpgradeAssessments.json new file mode 100644 index 000000000000..11105254b318 --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/examples/ListUpgradeAssessments.json @@ -0,0 +1,71 @@ +{ + "title": "List Upgrade Assessments", + "operationId": "UpgradeAssessments_List", + "parameters": { + "subscriptionId": "00000000-0000-0000-0000-000000000001", + "resourceGroupName": "rg1", + "clusterRp": "Microsoft.Kubernetes", + "clusterResourceName": "connectedClusters", + "clusterName": "clusterName1", + "api-version": "2026-06-15-preview" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "id": "/subscriptions/00000000-0000-0000-0000-000000000001/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/upgradeAssessments/default", + "name": "default", + "type": "Microsoft.KubernetesConfiguration/upgradeAssessments", + "systemData": { + "createdBy": "string", + "createdByType": "Application", + "createdAt": "2026-06-02T10:15:00.000Z", + "lastModifiedBy": "string", + "lastModifiedByType": "Application", + "lastModifiedAt": "2026-06-02T10:15:00.000Z" + }, + "properties": { + "currentKubernetesVersion": "1.27.9", + "targetKubernetesVersion": "1.30.0", + "assessmentTime": "2026-06-02T10:15:00Z", + "overallSeverity": "Critical", + "componentCompatibility": [ + { + "name": "kube-proxy", + "version": "1.27.9", + "compatibilityStatus": "Compatible", + "severity": "Pass" + }, + { + "name": "cert-manager", + "version": "1.8.0", + "compatibilityStatus": "Incompatible", + "severity": "Critical", + "minCompatibleVersion": "1.12.0", + "notes": "cert-manager v1.8.0 does not support Kubernetes 1.30+. Upgrade to >= 1.12.0." + } + ], + "deprecatedApis": [ + { + "group": "networking.k8s.io", + "version": "v1beta1", + "resource": "ingresses", + "removedRelease": "1.22", + "severity": "Critical" + } + ], + "readinessChecks": [ + { + "category": "APIServerHealth", + "severity": "Pass", + "details": "API server /healthz and /readyz endpoints responded successfully." + } + ] + } + } + ] + } + } + } +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/upgradeAssessments.json b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/upgradeAssessments.json new file mode 100644 index 000000000000..645442d2e72f --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/upgradeAssessments.json @@ -0,0 +1,541 @@ +{ + "swagger": "2.0", + "info": { + "title": "UpgradeAssessmentsClient", + "version": "2026-06-15-preview", + "description": "APIs for cluster upgrade assessment resources under Microsoft.KubernetesConfiguration.", + "x-typespec-generated": [ + { + "emitter": "@azure-tools/typespec-autorest" + } + ] + }, + "schemes": [ + "https" + ], + "host": "management.azure.com", + "produces": [ + "application/json" + ], + "consumes": [ + "application/json" + ], + "security": [ + { + "azure_auth": [ + "user_impersonation" + ] + } + ], + "securityDefinitions": { + "azure_auth": { + "type": "oauth2", + "description": "Azure Active Directory OAuth2 Flow.", + "flow": "implicit", + "authorizationUrl": "https://login.microsoftonline.com/common/oauth2/authorize", + "scopes": { + "user_impersonation": "impersonate your user account" + } + } + }, + "tags": [ + { + "name": "UpgradeAssessments" + } + ], + "paths": { + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{clusterRp}/{clusterResourceName}/{clusterName}/providers/Microsoft.KubernetesConfiguration/upgradeAssessments": { + "get": { + "operationId": "UpgradeAssessments_List", + "tags": [ + "UpgradeAssessments" + ], + "description": "List upgrade assessments for the cluster.", + "parameters": [ + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "clusterRp", + "in": "path", + "description": "The Kubernetes cluster RP - i.e. Microsoft.ContainerService, Microsoft.Kubernetes,\nMicrosoft.HybridContainerService, Microsoft.KubernetesConfiguration.", + "required": true, + "type": "string", + "pattern": "^Microsoft\\.(ContainerService|Kubernetes|HybridContainerService|KubernetesConfiguration)$" + }, + { + "name": "clusterResourceName", + "in": "path", + "description": "The Kubernetes cluster resource name - i.e. managedClusters, connectedClusters,\nprovisionedClusters, appliances.", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z]+$" + }, + { + "name": "clusterName", + "in": "path", + "description": "The name of the kubernetes cluster.", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9-_.]{0,62}$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/UpgradeAssessmentListResult" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-examples": { + "List Upgrade Assessments": { + "$ref": "./examples/ListUpgradeAssessments.json" + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink" + } + } + }, + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{clusterRp}/{clusterResourceName}/{clusterName}/providers/Microsoft.KubernetesConfiguration/upgradeAssessments/{upgradeAssessmentName}": { + "get": { + "operationId": "UpgradeAssessments_Get", + "tags": [ + "UpgradeAssessments" + ], + "description": "Get the upgrade assessment for a cluster.", + "parameters": [ + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ApiVersionParameter" + }, + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/SubscriptionIdParameter" + }, + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/parameters/ResourceGroupNameParameter" + }, + { + "name": "clusterRp", + "in": "path", + "description": "The Kubernetes cluster RP - i.e. Microsoft.ContainerService, Microsoft.Kubernetes,\nMicrosoft.HybridContainerService, Microsoft.KubernetesConfiguration.", + "required": true, + "type": "string", + "pattern": "^Microsoft\\.(ContainerService|Kubernetes|HybridContainerService|KubernetesConfiguration)$" + }, + { + "name": "clusterResourceName", + "in": "path", + "description": "The Kubernetes cluster resource name - i.e. managedClusters, connectedClusters,\nprovisionedClusters, appliances.", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z]+$" + }, + { + "name": "clusterName", + "in": "path", + "description": "The name of the kubernetes cluster.", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9-_.]{0,62}$" + }, + { + "name": "upgradeAssessmentName", + "in": "path", + "description": "Name of the UpgradeAssessments resource.", + "required": true, + "type": "string", + "pattern": "^[a-z]([a-z0-9._-]{0,126}[a-z0-9])?$" + } + ], + "responses": { + "200": { + "description": "Azure operation completed successfully.", + "schema": { + "$ref": "#/definitions/UpgradeAssessment" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/definitions/ErrorResponse" + } + } + }, + "x-ms-examples": { + "Get Upgrade Assessment": { + "$ref": "./examples/GetUpgradeAssessments.json" + } + } + } + } + }, + "definitions": { + "CompatibilityStatus": { + "type": "string", + "description": "Compatibility status of a cluster component with the target Kubernetes version.", + "enum": [ + "Compatible", + "Untested", + "Incompatible", + "Unknown" + ], + "x-ms-enum": { + "name": "CompatibilityStatus", + "modelAsString": true, + "values": [ + { + "name": "Compatible", + "value": "Compatible", + "description": "Component is compatible with the target version." + }, + { + "name": "Untested", + "value": "Untested", + "description": "Compatibility with the target version has not been tested." + }, + { + "name": "Incompatible", + "value": "Incompatible", + "description": "Component is incompatible with the target version." + }, + { + "name": "Unknown", + "value": "Unknown", + "description": "Compatibility status is unknown." + } + ] + } + }, + "ComponentCompatibility": { + "type": "object", + "description": "Compatibility status of a single cluster component with the target Kubernetes version.", + "properties": { + "name": { + "type": "string", + "description": "Component name (e.g., 'containerd', 'calico')." + }, + "version": { + "type": "string", + "description": "Installed component version." + }, + "compatibilityStatus": { + "$ref": "#/definitions/CompatibilityStatus", + "description": "Compatibility of the component with the target Kubernetes version." + }, + "severity": { + "$ref": "#/definitions/Severity", + "description": "Severity associated with this compatibility result." + }, + "minCompatibleVersion": { + "type": "string", + "description": "Minimum component version known to be compatible with targetKubernetesVersion." + }, + "notes": { + "type": "string", + "description": "Additional notes about compatibility." + } + }, + "required": [ + "name", + "version", + "compatibilityStatus", + "severity" + ] + }, + "DeprecatedApiUsage": { + "type": "object", + "description": "A deprecated Kubernetes API still in use in the cluster.", + "properties": { + "group": { + "type": "string", + "description": "API group (e.g., 'flowcontrol.apiserver.k8s.io')." + }, + "version": { + "type": "string", + "description": "API version (e.g., 'v1beta3')." + }, + "resource": { + "type": "string", + "description": "Resource plural name (e.g., 'flowschemas')." + }, + "removedRelease": { + "type": "string", + "description": "Kubernetes release in which this API is removed (e.g., '1.32')." + }, + "usageMetrics": { + "$ref": "#/definitions/HttpVerbUsageMetrics", + "description": "HTTP verb call counts observed for this deprecated API." + }, + "lastUsageObservedAt": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp of the last observed usage." + }, + "severity": { + "$ref": "#/definitions/Severity", + "description": "Severity of continued use of this deprecated API." + } + }, + "required": [ + "group", + "version", + "resource", + "severity" + ] + }, + "HttpVerbUsageMetrics": { + "type": "object", + "description": "Observed call counts per HTTP verb for a deprecated Kubernetes API.", + "properties": { + "get": { + "type": "integer", + "format": "int64", + "description": "Number of GET requests observed." + }, + "list": { + "type": "integer", + "format": "int64", + "description": "Number of LIST requests observed." + }, + "post": { + "type": "integer", + "format": "int64", + "description": "Number of POST (create) requests observed." + }, + "put": { + "type": "integer", + "format": "int64", + "description": "Number of PUT (replace) requests observed." + }, + "patch": { + "type": "integer", + "format": "int64", + "description": "Number of PATCH requests observed." + }, + "delete": { + "type": "integer", + "format": "int64", + "description": "Number of DELETE requests observed." + }, + "watch": { + "type": "integer", + "format": "int64", + "description": "Number of WATCH requests observed." + } + } + }, + "ReadinessCategory": { + "type": "string", + "description": "Category of a cluster readiness check.", + "enum": [ + "NodeStatus", + "APIServerHealth", + "PodDisruptionBudget", + "Addon", + "Storage", + "Networking" + ], + "x-ms-enum": { + "name": "ReadinessCategory", + "modelAsString": true, + "values": [ + { + "name": "NodeStatus", + "value": "NodeStatus", + "description": "Node status check." + }, + { + "name": "APIServerHealth", + "value": "APIServerHealth", + "description": "API server health check." + }, + { + "name": "PodDisruptionBudget", + "value": "PodDisruptionBudget", + "description": "Pod disruption budget check." + }, + { + "name": "Addon", + "value": "Addon", + "description": "Addon compatibility check." + }, + { + "name": "Storage", + "value": "Storage", + "description": "Storage compatibility check." + }, + { + "name": "Networking", + "value": "Networking", + "description": "Networking compatibility check." + } + ] + } + }, + "ReadinessCheck": { + "type": "object", + "description": "A single cluster readiness check result.", + "properties": { + "category": { + "$ref": "#/definitions/ReadinessCategory", + "description": "Category of the readiness check." + }, + "name": { + "type": "string", + "description": "Subject of the check (node name, workload namespace/name, etc.).\nOptional for cluster-wide checks." + }, + "severity": { + "$ref": "#/definitions/Severity", + "description": "Severity of the check result." + }, + "details": { + "type": "string", + "description": "Human-readable reason when severity is not 'pass'." + } + }, + "required": [ + "category", + "severity" + ] + }, + "Severity": { + "type": "string", + "description": "Severity of an upgrade-assessment finding or readiness check.", + "enum": [ + "Pass", + "Warning", + "Critical", + "Unknown" + ], + "x-ms-enum": { + "name": "Severity", + "modelAsString": true, + "values": [ + { + "name": "Pass", + "value": "Pass", + "description": "No issues found." + }, + { + "name": "Warning", + "value": "Warning", + "description": "Non-blocking issues found; upgrade is possible but action is recommended." + }, + { + "name": "Critical", + "value": "Critical", + "description": "Blocking issues found; upgrade should not proceed without remediation." + }, + { + "name": "Unknown", + "value": "Unknown", + "description": "Severity could not be determined." + } + ] + } + }, + "UpgradeAssessment": { + "type": "object", + "description": "ARM resource representing a Kubernetes cluster upgrade assessment.", + "properties": { + "properties": { + "$ref": "#/definitions/UpgradeAssessmentProperties", + "description": "Properties of the UpgradeAssessments resource." + } + }, + "allOf": [ + { + "$ref": "../../../../../../common-types/resource-management/v6/types.json#/definitions/ProxyResource" + } + ] + }, + "UpgradeAssessmentListResult": { + "type": "object", + "description": "The response of a UpgradeAssessment list operation.", + "properties": { + "value": { + "type": "array", + "description": "The UpgradeAssessment items on this page", + "items": { + "$ref": "#/definitions/UpgradeAssessment" + } + }, + "nextLink": { + "type": "string", + "format": "uri", + "description": "The link to the next page of items" + } + }, + "required": [ + "value" + ] + }, + "UpgradeAssessmentProperties": { + "type": "object", + "description": "Properties of a single UpgradeAssessment ARM resource.", + "properties": { + "currentKubernetesVersion": { + "type": "string", + "description": "Current Kubernetes version running on the cluster (e.g., '1.29').", + "readOnly": true + }, + "targetKubernetesVersion": { + "type": "string", + "description": "Target Kubernetes version to evaluate for upgrade (e.g., '1.30')." + }, + "assessmentTime": { + "type": "string", + "format": "date-time", + "description": "UTC timestamp when the in-cluster agent last computed this assessment.", + "readOnly": true + }, + "overallSeverity": { + "$ref": "#/definitions/Severity", + "description": "Rolled-up severity across all checks; highest severity wins.", + "readOnly": true + }, + "componentCompatibility": { + "type": "array", + "description": "Per-component compatibility results with the target Kubernetes version.", + "items": { + "$ref": "#/definitions/ComponentCompatibility" + }, + "readOnly": true, + "x-ms-identifiers": [] + }, + "deprecatedApis": { + "type": "array", + "description": "Deprecated Kubernetes APIs still in use in the cluster.", + "items": { + "$ref": "#/definitions/DeprecatedApiUsage" + }, + "readOnly": true, + "x-ms-identifiers": [] + }, + "readinessChecks": { + "type": "array", + "description": "Cluster readiness check results.", + "items": { + "$ref": "#/definitions/ReadinessCheck" + }, + "readOnly": true, + "x-ms-identifiers": [] + } + } + } + }, + "parameters": {} +} diff --git a/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/tspconfig.yaml b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/tspconfig.yaml new file mode 100644 index 000000000000..0f8b481df84c --- /dev/null +++ b/specification/kubernetesconfiguration/resource-manager/Microsoft.KubernetesConfiguration/upgradeAssessments/tspconfig.yaml @@ -0,0 +1,50 @@ +parameters: + "service-dir": + default: "sdk/upgradeassessments" +emit: + - "@azure-tools/typespec-autorest" +options: + "@azure-tools/typespec-autorest": + omit-unreachable-types: false + emitter-output-dir: "{project-root}" + output-file: "{version-status}/{version}/upgradeAssessments.json" + arm-types-dir: "{project-root}/../../../../common-types/resource-management" + emit-lro-options: "all" + examples-dir: "{project-root}/examples" + "@azure-tools/typespec-python": + service-dir: sdk/kubernetesconfiguration + emitter-output-dir: "{output-dir}/{service-dir}/azure-mgmt-kubernetesconfiguration-upgradeassessments" + namespace: "azure.mgmt.kubernetesconfiguration.upgradeassessments" + generate-test: true + generate-sample: true + flavor: "azure" + "@azure-tools/typespec-java": + service-dir: sdk/kubernetesconfiguration + emitter-output-dir: "{output-dir}/{service-dir}/azure-resourcemanager-kubernetesconfiguration-upgradeassessments" + namespace: "com.azure.resourcemanager.kubernetesconfiguration.upgradeassessments" + service-name: "UpgradeAssessments" + flavor: azure + "@azure-tools/typespec-ts": + service-dir: sdk/kubernetesconfiguration + emitter-output-dir: "{output-dir}/{service-dir}/arm-kubernetesconfiguration-upgradeassessments" + flavor: "azure" + compatibility-lro: true + experimental-extensible-enums: true + package-details: + name: "@azure/arm-kubernetesconfiguration-upgradeassessments" + "@azure-tools/typespec-go": + service-dir: "sdk/resourcemanager/kubernetesconfiguration" + emitter-output-dir: "{output-dir}/{service-dir}/armupgradeassessments" + module: "github.com/Azure/azure-sdk-for-go/{service-dir}/armupgradeassessments" + fix-const-stuttering: true + flavor: "azure" + generate-samples: true + generate-fakes: true + head-as-boolean: true + inject-spans: true + "@azure-typespec/http-client-csharp-mgmt": + namespace: "Azure.ResourceManager.KubernetesConfiguration.UpgradeAssessments" + emitter-output-dir: "{output-dir}/sdk/kubernetesconfiguration/{namespace}" +linter: + extends: + - "@azure-tools/typespec-azure-rulesets/resource-manager" diff --git a/specification/kubernetesconfiguration/resource-manager/readme.md b/specification/kubernetesconfiguration/resource-manager/readme.md index fc6e6e92a095..9aaa380aa5e6 100644 --- a/specification/kubernetesconfiguration/resource-manager/readme.md +++ b/specification/kubernetesconfiguration/resource-manager/readme.md @@ -28,7 +28,54 @@ These are the global settings for the KubernetesConfiguration. title: SourceControlConfigurationClient description: KubernetesConfiguration Client openapi-type: arm -tag: package-preview-2024-04 +``` + +### Tag: package-preview-2026-06 + +These settings apply only when `--tag=package-preview-2026-06` is specified on the command line. + +``` yaml $(tag) == 'package-preview-2026-06' +input-file: + - Microsoft.KubernetesConfiguration/stable/2023-05-01/extensions.json + - Microsoft.KubernetesConfiguration/preview/2024-04-01-preview/fluxconfiguration.json + - Microsoft.KubernetesConfiguration/stable/2023-05-01/kubernetesconfiguration.json + - Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/operations.json + - Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/KubernetesResources.json + - Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/upgradeAssessments.json +suppressions: + - code: ResourceNameRestriction + from: fluxconfiguration.json + reason: Existing service contract needs to be backward compatible, pattern validation exists in RP. + - code: DeleteResponseCodes + from: fluxconfiguration.json + reason: Existing service contract needs to be backward compatible, force delete does synchronous delete and returns 200. + - code: LroLocationHeader + from: fluxconfiguration.json + reason: Existing service contract needs to be backward compatible, 202 operations return Azure-Async-Operation header. + - code: AvoidAdditionalProperties + from: fluxconfiguration.json + reason: Existing service contract needs to be backward compatible. + - code: PatchResponseCodes + from: fluxconfiguration.json + reason: Existing service contract needs to be backward compatible. + - code: EnumInsteadOfBoolean + from: KubernetesResources.json + reason: Boolean properties mirror the Kubernetes API contract directly and must remain boolean for compatibility. +``` + +### Tag: package-preview-2026-06-only + +These settings apply only when `--tag=package-preview-2026-06-only` is specified on the command line. + +``` yaml $(tag) == 'package-preview-2026-06-only' +input-file: + - Microsoft.KubernetesConfiguration/operations/preview/2026-06-15-preview/operations.json + - Microsoft.KubernetesConfiguration/KubernetesResources/preview/2026-06-15-preview/KubernetesResources.json + - Microsoft.KubernetesConfiguration/upgradeAssessments/preview/2026-06-15-preview/upgradeAssessments.json +suppressions: + - code: EnumInsteadOfBoolean + from: KubernetesResources.json + reason: Boolean properties mirror the Kubernetes API contract directly and must remain boolean for compatibility. ``` ### Tag: package-preview-2024-04