Skip to content
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
c0140db
Add spec for KubeInventory
bgriddaluru May 29, 2026
9160baf
Refactor to generic structure
bgriddaluru May 29, 2026
4565396
Remove unused paths
bgriddaluru May 29, 2026
fca5ee8
Fix issues
bgriddaluru May 29, 2026
50617fd
refactor
May 29, 2026
9252164
Fix review comments
May 29, 2026
4bff9ea
Fix review comments
bgriddaluru May 29, 2026
885303d
pretty json
bgriddaluru May 30, 2026
75c6991
Remove Provisioning state
bgriddaluru May 30, 2026
47ab9d1
Update provisioning state as per rules
bgriddaluru Jun 1, 2026
6f9602a
Compilation and Lint fixes
bgriddaluru Jun 1, 2026
5aa1948
Merge branch 'Azure:main' into main
bgriddaluru Jun 1, 2026
b6b0828
Fix tsp formatting
bgriddaluru Jun 1, 2026
dca32ef
Merge branch 'Azure:main' into main
bgriddaluru Jun 1, 2026
eb1a8f4
Fix lint issues
bgriddaluru Jun 1, 2026
10fd55c
Fix lint issues
bgriddaluru Jun 1, 2026
309da03
Merge branch 'Azure:main' into main
bgriddaluru Jun 1, 2026
15a139d
Add attachedToExtension field
bgriddaluru Jun 2, 2026
797251d
Merge branch 'Azure:main' into main
bgriddaluru Jun 2, 2026
7e22118
Fix review comments
bgriddaluru Jun 4, 2026
c5fb5e9
Merge branch 'main' of https://github.com/bgriddaluru/azure-rest-api-…
bgriddaluru Jun 4, 2026
686794e
Split UpgradeAssessment and KubeInventory
bgriddaluru Jun 4, 2026
11525d9
Update Readme
bgriddaluru Jun 4, 2026
16978bc
Remove Provisioning state
bgriddaluru Jun 4, 2026
cb287a6
Add more fields and examples
bgriddaluru Jun 4, 2026
85e88d5
Add new words to cspell
bgriddaluru Jun 4, 2026
edc5f32
Merge branch 'main' into main
vikeshi26 Jun 5, 2026
d5a8bcb
Add more resource type fields
bgriddaluru Jun 5, 2026
14edde0
Merge branch 'Azure:main' into main
bgriddaluru Jun 8, 2026
85fd2dc
Pretty Fixes
bgriddaluru Jun 8, 2026
822274e
Pretty Fixes
bgriddaluru Jun 8, 2026
d93a2eb
Fix examples
bgriddaluru Jun 8, 2026
cc69385
Update visibility property
bgriddaluru Jun 8, 2026
8e0d251
Merge branch 'Azure:main' into main
bgriddaluru Jun 8, 2026
896b7dc
Fix review comments
bgriddaluru Jun 9, 2026
da0b86d
Merge branch 'Azure:main' into main
bgriddaluru Jun 9, 2026
5a979e9
Merge branch 'Azure:main' into main
bgriddaluru Jun 9, 2026
9f5da37
Rename to KubernetesResources and UpgradeAssessments
bgriddaluru Jun 11, 2026
34b7ee7
Merge branch 'main' of https://github.com/bgriddaluru/azure-rest-api-…
bgriddaluru Jun 11, 2026
65103be
Fix file names
bgriddaluru Jun 11, 2026
18381b8
Fix pretty and other examples
bgriddaluru Jun 11, 2026
77e94ff
Merge branch 'Azure:main' into main
bgriddaluru Jun 11, 2026
60cd8b9
Fix pretty
bgriddaluru Jun 11, 2026
e5ff801
Revert commit to lease file
bgriddaluru Jun 11, 2026
33bdae5
Update operations to include new api version
bgriddaluru Jun 11, 2026
3bd2c9a
Merge branch 'Azure:main' into main
bgriddaluru Jun 11, 2026
bc65e81
Use v6 for the latest version
bgriddaluru Jun 11, 2026
eac1a9e
Fix violations
bgriddaluru Jun 11, 2026
a983baa
update readme
bgriddaluru Jun 11, 2026
9e9ec99
Fix operations type spec
bgriddaluru Jun 11, 2026
1dd42c8
Fix examples
bgriddaluru Jun 11, 2026
ef6db51
Fix pretty
bgriddaluru Jun 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
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 KubeInventory is Azure.ResourceManager.ProxyResource<KubeInventoryProperties> {
...ResourceNameParameter<
Resource = KubeInventory,
KeyName = "kubeInventoryName",
SegmentName = "kubeInventory",
NamePattern = ""
Comment thread
bgriddaluru marked this conversation as resolved.
Outdated
>;
}

/**
* Operations alias for KubeInventory using the cluster extension routing pattern.
* Generates URLs of the form:
* /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{clusterRp}/{clusterResourceName}/{clusterName}/providers/Microsoft.KubernetesConfiguration/kubeInventory[/{kubeInventoryName}]
*/
alias KubeInventoryOps = Azure.ResourceManager.Legacy.ExtensionOperations<
{
...ApiVersionParameter;
...SubscriptionIdParameter;
...ResourceGroupParameter;

/**
* The Kubernetes cluster RP - i.e. Microsoft.ContainerService, Microsoft.Kubernetes,
* Microsoft.HybridContainerService.
*/
@path
@segment("providers")
@key
clusterRp: string;

/**
* The Kubernetes cluster resource name - i.e. managedClusters, connectedClusters,
* provisionedClusters, appliances.
*/
@key
@path
@pattern("^[a-zA-Z]*$")
Comment thread
bgriddaluru marked this conversation as resolved.
Outdated
clusterResourceName: string;

/**
* The name of the kubernetes cluster.
*/
@key
@path
@pattern("^.*")
clusterName: string;
},
{
...Azure.ResourceManager.Extension.ExtensionProviderNamespace<KubeInventory>;
...ParentKeysOf<KubeInventory>;
},
{
...Azure.ResourceManager.Extension.ExtensionProviderNamespace<KubeInventory>;
...KeysOf<KubeInventory>;
}
>;

@armResourceOperations(#{ allowStaticRoutes: true, omitTags: true })
interface KubeInventories {
/**
* Get the kubeInventory singleton for a cluster.
*/
@tag("KubeInventory")
get is KubeInventoryOps.Read<KubeInventory>;

/**
* List kubeInventory containers for the cluster (currently always a single 'default').
*/
@tag("KubeInventory")
list is KubeInventoryOps.List<KubeInventory>;
}

@@doc(KubeInventory.name, "Name of the KubeInventory resource.");
@@doc(KubeInventory.properties, "Properties of the KubeInventory resource.");
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
import "@azure-tools/typespec-azure-core";
import "@azure-tools/typespec-azure-resource-manager";
import "@typespec/rest";
import "./models.tsp";
import "./KubeInventory.tsp";

using TypeSpec.Rest;
using Azure.Core;
using Azure.ResourceManager;
using Azure.ResourceManager.Foundations;
using TypeSpec.Http;

namespace Microsoft.KubernetesConfiguration;

/**
* Periodic, cluster-computed Kubernetes upgrade assessment.
*/
@parentResource(KubeInventory)
model UpgradeAssessment is Azure.ResourceManager.ProxyResource<UpgradeAssessmentProperties> {
...ResourceNameParameter<
Resource = UpgradeAssessment,
KeyName = "assessmentName",
SegmentName = "upgradeAssessments",
NamePattern = ""
Comment thread
bgriddaluru marked this conversation as resolved.
Outdated
>;
}

/**
* Operations alias for UpgradeAssessment using the cluster + KubeInventory extension routing pattern.
* Generates URLs of the form:
* .../providers/Microsoft.KubernetesConfiguration/kubeInventory/{kubeInventoryName}/upgradeAssessments[/{assessmentName}]
*/
alias UpgradeAssessmentOps = Azure.ResourceManager.Legacy.ExtensionOperations<
{
...ApiVersionParameter;
...SubscriptionIdParameter;
...ResourceGroupParameter;

/**
* The Kubernetes cluster RP - i.e. Microsoft.ContainerService, Microsoft.Kubernetes,
* Microsoft.HybridContainerService.
*/
@path
@segment("providers")
@key
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("^.*")
clusterName: string;
},
{
...Azure.ResourceManager.Extension.ExtensionProviderNamespace<UpgradeAssessment>;
...ParentKeysOf<UpgradeAssessment>;
},
{
...Azure.ResourceManager.Extension.ExtensionProviderNamespace<UpgradeAssessment>;
...ParentKeysOf<UpgradeAssessment>;
...KeysOf<UpgradeAssessment>;
}
>;

/**
* RoutedOperations alias used for the refresh action on a specific UpgradeAssessment instance.
* Includes all path params up to and including assessmentName so the action route resolves correctly.
*/
alias UpgradeAssessmentBuildingOps = Azure.ResourceManager.Legacy.RoutedOperations<
{
...ApiVersionParameter;
...SubscriptionIdParameter;
...ResourceGroupParameter;

/**
* The Kubernetes cluster RP - i.e. Microsoft.ContainerService, Microsoft.Kubernetes,
* Microsoft.HybridContainerService.
*/
@path
@segment("providers")
@key
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("^.*")
clusterName: string;

...KeysOf<KubeInventory>;
...KeysOf<UpgradeAssessment>;
},
{},
ResourceRoute = #{
route: "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{clusterRp}/{clusterResourceName}/{clusterName}/providers/Microsoft.KubernetesConfiguration/kubeInventory",
}
>;

@armResourceOperations(#{ allowStaticRoutes: true, omitTags: true })
interface UpgradeAssessments {
/**
* Get the upgrade assessment for a cluster.
Comment thread
bgriddaluru marked this conversation as resolved.
Outdated
*/
@tag("UpgradeAssessments")
get is UpgradeAssessmentOps.Read<UpgradeAssessment>;

/**
* List upgrade assessments under a kubeInventory (currently always a single 'current').
*/
@tag("UpgradeAssessments")
list is UpgradeAssessmentOps.List<UpgradeAssessment>;

/**
* Internal write path used by the in-cluster agent to publish or update an upgrade assessment.
* End users do NOT have RBAC for this operation; access is restricted to the cluster's managed identity.
*/
@tag("UpgradeAssessments")
createOrUpdate is UpgradeAssessmentOps.CreateOrUpdateAsync<UpgradeAssessment>;

/**
* Trigger the in-cluster agent to recompute the upgrade assessment.
* Long-running; only one refresh per cluster may be in flight at a time (returns 409 otherwise).
*/
@tag("UpgradeAssessments")
@post
@route("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{clusterRp}/{clusterResourceName}/{clusterName}/providers/Microsoft.KubernetesConfiguration/kubeInventory/{kubeInventoryName}/upgradeAssessments/{assessmentName}/refresh")
Comment thread
bgriddaluru marked this conversation as resolved.
Outdated
refresh is UpgradeAssessmentBuildingOps.ActionAsync<
UpgradeAssessment,
RefreshRequest,
| ArmAcceptedLroResponse<LroHeaders = ArmCombinedLroHeaders<FinalResult = UpgradeAssessment>>
| ArmResponse<UpgradeAssessment>
>;
}

@@doc(UpgradeAssessment.name, "Name of the UpgradeAssessment resource.");
@@doc(
UpgradeAssessment.properties,
"Properties of the UpgradeAssessment resource."
);
@@doc(
UpgradeAssessments.createOrUpdate::parameters.resource,
"The UpgradeAssessment resource body."
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
{
"title": "Create or Update UpgradeAssessment",
"operationId": "UpgradeAssessments_CreateOrUpdate",
"parameters": {
"subscriptionId": "subId1",
"resourceGroupName": "rg1",
"clusterRp": "Microsoft.Kubernetes",
"clusterResourceName": "connectedClusters",
"clusterName": "clusterName1",
"kubeInventoryName": "default",
"assessmentName": "current",
"api-version": "2026-06-15-preview",
"resource": {
"properties": {
"kubernetesVersion": "1.29",
"targetKubernetesVersion": "1.30",
"overallSeverity": "critical",
"componentCompatibility": [
{
"name": "containerd",
"version": "1.6.8",
"compatibilityStatus": "incompatible",
"severity": "critical",
"minCompatibleVersion": "1.7.0",
"notes": "containerd 1.6.x is not compatible with Kubernetes 1.30. Upgrade to 1.7.x required."
}
],
"deprecatedApis": [
{
"group": "flowcontrol.apiserver.k8s.io",
"version": "v1beta3",
"resource": "flowschemas",
"removedRelease": "1.32",
"usageMetrics": {
"get": 12,
"list": 45
},
"lastUsageObservedAt": "2026-06-09T14:22:00.000Z",
"severity": "warning"
}
],
"readinessChecks": [
{
"category": "NodeStatus",
"severity": "pass"
},
{
"category": "Storage",
"name": "node-pool-1",
"severity": "critical",
"details": "Node disk pressure detected; upgrade may fail."
}
]
}
}
},
"responses": {
"200": {
"body": {
"id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubeInventory/default/upgradeAssessments/current",
"name": "current",
"type": "Microsoft.KubernetesConfiguration/kubeInventory/upgradeAssessments",
"systemData": {
"createdBy": "cluster-managed-identity",
"createdByType": "Application",
"createdAt": "2026-06-01T10:00:00.000Z",
"lastModifiedBy": "cluster-managed-identity",
"lastModifiedByType": "Application",
"lastModifiedAt": "2026-06-10T09:00:00.000Z"
},
"properties": {
"provisioningState": "Succeeded",
"assessmentTime": "2026-06-10T09:00:00.000Z",
"kubernetesVersion": "1.29",
"targetKubernetesVersion": "1.30",
"overallSeverity": "critical",
"componentCompatibility": [
{
"name": "containerd",
"version": "1.6.8",
"compatibilityStatus": "incompatible",
"severity": "critical",
"minCompatibleVersion": "1.7.0",
"notes": "containerd 1.6.x is not compatible with Kubernetes 1.30. Upgrade to 1.7.x required."
}
],
"deprecatedApis": [
{
"group": "flowcontrol.apiserver.k8s.io",
"version": "v1beta3",
"resource": "flowschemas",
"removedRelease": "1.32",
"usageMetrics": {
"get": 12,
"list": 45
},
"lastUsageObservedAt": "2026-06-09T14:22:00.000Z",
"severity": "warning"
}
],
"readinessChecks": [
{
"category": "NodeStatus",
"severity": "pass"
},
{
"category": "Storage",
"name": "node-pool-1",
"severity": "critical",
"details": "Node disk pressure detected; upgrade may fail."
}
]
}
}
},
"201": {
"headers": {
"Azure-AsyncOperation": "https://management.azure.com/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubeInventory/default/upgradeAssessments/current/operations/operationId1?api-version=2026-06-15-preview",
"Retry-After": 10
},
"body": {
"id": "/subscriptions/subId1/resourceGroups/rg1/providers/Microsoft.Kubernetes/connectedClusters/clusterName1/providers/Microsoft.KubernetesConfiguration/kubeInventory/default/upgradeAssessments/current",
"name": "current",
"type": "Microsoft.KubernetesConfiguration/kubeInventory/upgradeAssessments",
"properties": {
"provisioningState": "Updating",
"kubernetesVersion": "1.29",
"targetKubernetesVersion": "1.30"
}
}
}
}
}
Loading
Loading