in webview-ui/src/AttachAcrToCluster/AttachAcrToCluster.tsx [25:183]
export function AttachAcrToCluster(initialState: InitialState) {
const { state, eventHandlers } = useStateManagement(stateUpdater, initialState, vscode);
const updates: EventHandlerFunc[] = [];
const {
lazySubscriptions,
lazyAcrResourceGroups,
lazyClusterResourceGroups,
lazyAcrs,
lazyClusters,
lazyAcrRoleState,
} = prepareData(state, updates);
useEffect(() => {
updates.map((fn) => fn(eventHandlers));
});
function getAcrAuthorizationActionItemProps(): InlineActionProps {
const createAction = makeFixAction(faLink, "Attach", null /* No action available yet */, true);
const deleteAction = makeFixAction(faLinkSlash, "Detach", null /* No action available yet */, false);
const actionItemProps = makeInlineActionProps("ACR Pull", createAction, deleteAction);
if (state.selectedAcr === null) {
actionItemProps.extraInfo = "Please select an ACR.";
return actionItemProps;
}
if (state.selectedCluster === null) {
actionItemProps.extraInfo = "Please select a cluster.";
return actionItemProps;
}
if (!isLoaded(lazyAcrRoleState)) {
actionItemProps.extraInfo = "Loading ACR role assignments...";
return actionItemProps;
}
const roleState = lazyAcrRoleState.value;
const acr = state.selectedAcr;
const cluster = state.selectedCluster;
const isDone = roleState.hasAcrPull;
actionItemProps.isDone = isDone;
createAction.canPerformAction = !isDone;
createAction.action = () => handleCreateAcrRoleAssignment(acr, cluster);
deleteAction.canPerformAction = isDone;
deleteAction.action = () => handleDeleteAcrRoleAssignment(acr, cluster);
return actionItemProps;
}
function handleCreateAcrRoleAssignment(acr: Acr, cluster: Cluster) {
eventHandlers.onSetAcrRoleAssignmentLoading({ acrKey: acr, clusterKey: cluster });
vscode.postCreateAcrRoleAssignmentRequest({
acrKey: acr,
clusterKey: cluster,
});
}
function handleDeleteAcrRoleAssignment(acr: Acr, cluster: Cluster) {
eventHandlers.onSetAcrRoleAssignmentLoading({ acrKey: acr, clusterKey: cluster });
vscode.postDeleteAcrRoleAssignmentRequest({
acrKey: acr,
clusterKey: cluster,
});
}
return (
<>
<h2>Attach Azure Container Registry to Cluster</h2>
<fieldset className={styles.inputContainer}>
<p className={styles.fullWidth}>
Select a cluster and Azure Container Registry (ACR) to attach. For more information on attaching an
ACR to a cluster, see{" "}
<a href="https://learn.microsoft.com/en-us/azure/aks/cluster-container-registry-integration?tabs=azure-cli#configure-acr-integration-for-an-existing-aks-cluster">
Configure ACR integration for an existing AKS cluster
</a>
.
</p>
<p className={styles.fullWidth}>
This operation assigns the{" "}
<a href="https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#acrpull">
AcrPull
</a>{" "}
role to the Microsoft Entra ID managed identity associated with your AKS cluster.
</p>
<label htmlFor="subscription-input" className={styles.label}>
Subscription
</label>
<ResourceSelector<Subscription>
id="subscription-input"
className={styles.control}
resources={lazySubscriptions}
selectedItem={state.selectedSubscription}
valueGetter={(s) => s.subscriptionId}
labelGetter={(s) => s.name}
onSelect={eventHandlers.onSetSelectedSubscription}
/>
<label htmlFor="acr-rg-input" className={styles.label}>
ACR Resource Group
</label>
<ResourceSelector<string>
id="acr-rg-input"
className={styles.control}
resources={lazyAcrResourceGroups}
selectedItem={state.selectedAcrResourceGroup}
valueGetter={(g) => g}
labelGetter={(g) => g}
onSelect={eventHandlers.onSetSelectedAcrResourceGroup}
/>
<label htmlFor="acr-input" className={styles.label}>
Container Registry
</label>
<ResourceSelector<Acr>
id="acr-input"
className={styles.control}
resources={lazyAcrs}
selectedItem={state.selectedAcr}
valueGetter={(acr) => acr.acrName}
labelGetter={(acr) => acr.acrName}
onSelect={eventHandlers.onSetSelectedAcr}
/>
<label htmlFor="cluster-rg-input" className={styles.label}>
Cluster Resource Group
</label>
<ResourceSelector<string>
id="cluster-rg-input"
className={styles.control}
resources={lazyClusterResourceGroups}
selectedItem={state.selectedClusterResourceGroup}
valueGetter={(g) => g}
labelGetter={(g) => g}
onSelect={eventHandlers.onSetSelectedClusterResourceGroup}
/>
<label htmlFor="cluster-input" className={styles.label}>
Cluster
</label>
<ResourceSelector<Cluster>
id="cluster-input"
className={styles.control}
resources={lazyClusters}
selectedItem={state.selectedCluster}
valueGetter={(c) => c.clusterName}
labelGetter={(c) => c.clusterName}
onSelect={eventHandlers.onSetSelectedCluster}
/>
<label className={styles.label}>Role Assignment</label>
<div className={`${styles.control} ${styles.actionItemList}`}>
<InlineAction {...getAcrAuthorizationActionItemProps()} />
</div>
</fieldset>
</>
);
}