Skip to content

Commit

Permalink
Copy kots images to private registry if one is configured during self…
Browse files Browse the repository at this point in the history
…-updates
  • Loading branch information
divolgin committed Mar 4, 2022
1 parent d03c16f commit 74b061d
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 16 deletions.
29 changes: 26 additions & 3 deletions cmd/kots/cli/admin-console-push-images.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package cli

import (
"context"
"fmt"
"net/url"
"os"
"strings"

"github.com/pkg/errors"
"github.com/replicatedhq/kots/pkg/docker/registry"
Expand Down Expand Up @@ -43,7 +46,12 @@ func AdminPushImagesCmd() *cobra.Command {
username := v.GetString("registry-username")
password := v.GetString("registry-password")
if username == "" && password == "" {
u, p, err := getRegistryCredentialsFromSecret(endpoint, v.GetString("namespace"))
hostname, err := getHostnameFromEndpoint(endpoint)
if err != nil {
return errors.Wrap(err, "failed get hostname from endpoint")
}

u, p, err := getRegistryCredentialsFromSecret(hostname, v.GetString("namespace"))
if err != nil {
return errors.Wrap(err, "failed get registry login from secret")
}
Expand All @@ -63,7 +71,7 @@ func AdminPushImagesCmd() *cobra.Command {
options := kotsadmtypes.PushImagesOptions{
KotsadmTag: v.GetString("kotsadm-tag"),
Registry: registry.RegistryOptions{
Endpoint: args[1],
Endpoint: endpoint,
Username: username,
Password: password,
},
Expand Down Expand Up @@ -109,7 +117,7 @@ func getRegistryCredentialsFromSecret(endpoint string, namespace string) (userna
return
}

secret, err := clientset.CoreV1().Secrets(namespace).Get(context.TODO(), "kotsadm-replicated-registry", metav1.GetOptions{})
secret, err := clientset.CoreV1().Secrets(namespace).Get(context.TODO(), kotsadmtypes.PrivateKotsadmRegistrySecret, metav1.GetOptions{})
if err != nil {
err = errors.Wrap(err, "failed to get secret")
return
Expand All @@ -121,6 +129,7 @@ func getRegistryCredentialsFromSecret(endpoint string, namespace string) (userna
return
}

endpoint = strings.Split(endpoint, "/")[0]
credentials, err := registry.GetCredentialsForRegistryFromConfigJSON(dockerConfigJson, endpoint)
if err != nil {
err = errors.Wrap(err, "failed to get credentials")
Expand All @@ -131,3 +140,17 @@ func getRegistryCredentialsFromSecret(endpoint string, namespace string) (userna
password = credentials.Password
return
}

func getHostnameFromEndpoint(endpoint string) (string, error) {
if !strings.HasPrefix(endpoint, "http") {
// url.Parse doesn't work without scheme
endpoint = fmt.Sprintf("https://%s", endpoint)
}

parsed, err := url.Parse(endpoint)
if err != nil {
return "", errors.Wrap(err, "failed to parse endpoint")
}

return parsed.Hostname(), nil
}
2 changes: 2 additions & 0 deletions deploy/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ COPY --chown=kotsadm:kotsadm ./deploy/fs-minio-keys-sha.sh /fs-minio-keys-sha.sh
COPY --chown=kotsadm:kotsadm ./deploy/s3-bucket-create.sh /s3-bucket-create.sh
COPY --chown=kotsadm:kotsadm ./deploy/s3-bucket-head.sh /s3-bucket-head.sh

COPY --chown=kotsadm:kotsadm ./deploy/kots-upgrade.sh /kots-upgrade.sh

COPY --chown=kotsadm:kotsadm ./bin/kotsadm /kotsadm
COPY --chown=kotsadm:kotsadm ./bin/kots /kots

Expand Down
28 changes: 28 additions & 0 deletions deploy/kots-upgrade.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/bin/bash

set -e

while [ "$1" != "" ]; do
_param="$(echo "$1" | cut -d= -f1)"
_value="$(echo "$1" | grep '=' | cut -d= -f2-)"
case $_param in
registry)
REGISTRY="$_value"
;;
namespace)
NAMESPACE="$_value"
;;
*)
echo >&2 "Error: unknown parameter \"$_param\""
exit 1
;;
esac
shift
done

if [ -n "$REGISTRY" ]
then
/kots admin-console push-images docker.io $REGISTRY -n $NAMESPACE
fi

/kots admin-console upgrade -n $NAMESPACE
44 changes: 35 additions & 9 deletions pkg/kotsadm/updates.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"context"
"fmt"
"io"
"os"
"time"

"github.com/pkg/errors"
Expand Down Expand Up @@ -89,12 +90,31 @@ func UpdateToVersion(newVersion string) error {
return errors.New("update already in progress")
}

ns := util.PodNamespace

clientset, err := k8sutil.GetClientset()
if err != nil {
return errors.Wrap(err, "failed to create k8s client")
}

ns := util.PodNamespace
kotsOptions, err := GetKotsadmOptionsFromCluster(ns, clientset)
if err != nil {
return errors.Wrap(err, "failed to get kots options from cluster")
}

args := []string{
fmt.Sprintf("namespace=%s", ns),
}

if kotsOptions.OverrideRegistry != "" && !kotsOptions.IsReadOnly {
var registryValue string
if kotsOptions.OverrideNamespace == "" {
registryValue = kotsOptions.OverrideRegistry
} else {
registryValue = fmt.Sprintf("%s/%s", kotsOptions.OverrideRegistry, kotsOptions.OverrideNamespace)
}
args = append(args, fmt.Sprintf("registry=%s", registryValue))
}

pod := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Expand All @@ -111,14 +131,20 @@ func UpdateToVersion(newVersion string) error {
RestartPolicy: corev1.RestartPolicyNever,
Containers: []corev1.Container{
{
Name: "kotsadm-updater",
Image: fmt.Sprintf("kotsadm/kotsadm:%s", newVersion),
Command: []string{"/kots"},
Args: []string{
"admin-console",
"upgrade",
"-n",
ns,
Name: "kotsadm-updater",
Image: fmt.Sprintf("kotsadm/kotsadm:%s", newVersion),
ImagePullPolicy: corev1.PullIfNotPresent,
Command: []string{"/kots-upgrade.sh"},
Args: args,
Env: []corev1.EnvVar{
{
Name: "DISABLE_OUTBOUND_CONNECTIONS",
Value: os.Getenv("DISABLE_OUTBOUND_CONNECTIONS"),
},
{
Name: "KOTSADM_INSECURE_SRCREGISTRY",
Value: os.Getenv("KOTSADM_INSECURE_SRCREGISTRY"),
},
},
},
},
Expand Down
10 changes: 8 additions & 2 deletions web/src/components/apps/AppVersionHistory.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -1145,6 +1145,12 @@ class AppVersionHistory extends Component {
checkingUpdateTextShort = checkingUpdateTextShort.slice(0, 30) + "...";
}

const renderKotsUpgradeStatus = this.state.kotsUpdateStatus && !this.state.kotsUpdateMessage;
let shortKotsUpdateMessage = this.state.kotsUpdateMessage;
if (shortKotsUpdateMessage && shortKotsUpdateMessage.length > 60) {
shortKotsUpdateMessage = shortKotsUpdateMessage.substring(0, 60) + "...";
}

return (
<div className="flex flex-column flex1 u-position--relative u-overflow--auto u-padding--20">
<Helmet>
Expand Down Expand Up @@ -1394,12 +1400,12 @@ class AppVersionHistory extends Component {
<div className="flex-column justifyContent--center alignItems--center">
<p className="u-fontSize--large u-textColor--primary u-lineHeight--bold u-marginBottom--10">Upgrading...</p>
<Loader className="flex alignItems--center" size="32" />
{this.state.kotsUpdateStatus ?
{renderKotsUpgradeStatus ?
<p className="u-fontSize--normal u-textColor--primary u-lineHeight--normal u-marginBottom--10">{ this.state.kotsUpdateStatus }</p>
: null
}
{this.state.kotsUpdateMessage ?
<p className="u-fontSize--normal u-textColor--primary u-lineHeight--normal u-marginBottom--10">{ this.state.kotsUpdateMessage }</p>
<p className="u-fontSize--normal u-textColor--primary u-lineHeight--normal u-marginBottom--10">{ shortKotsUpdateMessage }</p>
: null
}
</div>
Expand Down
10 changes: 8 additions & 2 deletions web/src/components/apps/DashboardVersionCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -945,6 +945,12 @@ class DashboardVersionCard extends React.Component {
checkingUpdateTextShort = checkingUpdateTextShort.slice(0, 30) + "...";
}

const renderKotsUpgradeStatus = this.state.kotsUpdateStatus && !this.state.kotsUpdateMessage;
let shortKotsUpdateMessage = this.state.kotsUpdateMessage;
if (shortKotsUpdateMessage && shortKotsUpdateMessage.length > 60) {
shortKotsUpdateMessage = shortKotsUpdateMessage.substring(0, 60) + "...";
}

return (
<div className="flex-column flex1 dashboard-card">
<div className="flex flex1 justifyContent--spaceBetween alignItems--center u-marginBottom--10">
Expand Down Expand Up @@ -1089,12 +1095,12 @@ class DashboardVersionCard extends React.Component {
<div className="flex-column justifyContent--center alignItems--center">
<p className="u-fontSize--large u-textColor--primary u-lineHeight--bold u-marginBottom--10">Upgrading...</p>
<Loader className="flex alignItems--center" size="32" />
{this.state.kotsUpdateStatus ?
{renderKotsUpgradeStatus ?
<p className="u-fontSize--normal u-textColor--primary u-lineHeight--normal u-marginBottom--10">{ this.state.kotsUpdateStatus }</p>
: null
}
{this.state.kotsUpdateMessage ?
<p className="u-fontSize--normal u-textColor--primary u-lineHeight--normal u-marginBottom--10">{ this.state.kotsUpdateMessage }</p>
<p className="u-fontSize--normal u-textColor--primary u-lineHeight--normal u-marginBottom--10">{ shortKotsUpdateMessage }</p>
: null
}
</div>
Expand Down

0 comments on commit 74b061d

Please sign in to comment.