106 lines
2.7 KiB
TypeScript
106 lines
2.7 KiB
TypeScript
import { Secret } from 'kubernetes-types/core/v1';
|
|
|
|
import { useCurrentUser } from '@/react/hooks/useUser';
|
|
import { Registry } from '@/react/portainer/registries/types/registry';
|
|
|
|
import { Badge } from '@@/Badge';
|
|
import { Link } from '@@/Link';
|
|
import { Tooltip } from '@@/Tip/Tooltip';
|
|
import { TooltipWithChildren } from '@@/Tip/TooltipWithChildren';
|
|
|
|
type Props = {
|
|
secretName: string;
|
|
namespace: string;
|
|
secret: Secret | undefined;
|
|
registry: Registry | undefined;
|
|
};
|
|
|
|
export function ImagePullSecretBadge({
|
|
secretName,
|
|
namespace,
|
|
secret,
|
|
registry,
|
|
}: Props) {
|
|
const { isPureAdmin } = useCurrentUser();
|
|
const registryIdStr =
|
|
secret?.metadata?.annotations?.['portainer.io/registry.id'];
|
|
const registryId = registryIdStr
|
|
? parseInt(registryIdStr, 10) || undefined
|
|
: undefined;
|
|
|
|
const registryTooltip = registry && (
|
|
<Tooltip
|
|
position="right"
|
|
message={
|
|
<div className="flex flex-col gap-1">
|
|
<span>
|
|
<span className="font-medium">Registry: </span>
|
|
{isPureAdmin ? (
|
|
<Link
|
|
to="portainer.registries.registry"
|
|
params={{ id: registry.Id }}
|
|
className="!text-inherit underline"
|
|
data-cy={`registry-link-${registry.Id}`}
|
|
rel="noopener noreferrer"
|
|
target="_blank"
|
|
>
|
|
{registry.Name}
|
|
</Link>
|
|
) : (
|
|
registry.Name
|
|
)}
|
|
</span>
|
|
<span>
|
|
<span className="font-medium">URL: </span>
|
|
{registry.URL}
|
|
</span>
|
|
</div>
|
|
}
|
|
/>
|
|
);
|
|
|
|
const registryNotFoundMessage =
|
|
'The registry associated with this secret could not be found. It may have been deleted.';
|
|
const showRegistryNotFound = !!registryId && !registry;
|
|
|
|
const secretLink = (
|
|
<Link
|
|
to="kubernetes.secrets.secret"
|
|
params={{ name: secretName, namespace }}
|
|
data-cy={`image-pull-secret-link-${secretName}`}
|
|
className="!text-inherit"
|
|
>
|
|
{secretName}
|
|
</Link>
|
|
);
|
|
|
|
const missingSecretContent = (
|
|
<>
|
|
{secretName}
|
|
<Tooltip message="This secret doesn't exist in the namespace." />
|
|
</>
|
|
);
|
|
|
|
function renderSecretName() {
|
|
const content = secret ? secretLink : missingSecretContent;
|
|
if (showRegistryNotFound) {
|
|
return (
|
|
<TooltipWithChildren message={registryNotFoundMessage}>
|
|
<span>{content}</span>
|
|
</TooltipWithChildren>
|
|
);
|
|
}
|
|
return content;
|
|
}
|
|
|
|
return (
|
|
<Badge
|
|
type={secret ? 'info' : 'warn'}
|
|
className="inline-flex min-w-max items-center"
|
|
>
|
|
{renderSecretName()}
|
|
{registryTooltip}
|
|
</Badge>
|
|
);
|
|
}
|