mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-10-22 15:09:39 +00:00
93 lines
3.5 KiB
Go
93 lines
3.5 KiB
Go
/*
|
|
Copyright 2018 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
// Package kubeadm holds the internal kubeadm API types
|
|
// Note: This file should be kept in sync with the similar one for the external API
|
|
// TODO: The BootstrapTokenString object should move out to either k8s.io/client-go or k8s.io/api in the future
|
|
// (probably as part of Bootstrap Tokens going GA). It should not be staged under the kubeadm API as it is now.
|
|
package kubeadm
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
bootstrapapi "k8s.io/cluster-bootstrap/token/api"
|
|
bootstraputil "k8s.io/cluster-bootstrap/token/util"
|
|
)
|
|
|
|
// BootstrapTokenString is a token of the format abcdef.abcdef0123456789 that is used
|
|
// for both validation of the practically of the API server from a joining node's point
|
|
// of view and as an authentication method for the node in the bootstrap phase of
|
|
// "kubeadm join". This token is and should be short-lived
|
|
type BootstrapTokenString struct {
|
|
ID string
|
|
Secret string
|
|
}
|
|
|
|
// MarshalJSON implements the json.Marshaler interface.
|
|
func (bts BootstrapTokenString) MarshalJSON() ([]byte, error) {
|
|
return []byte(fmt.Sprintf(`"%s"`, bts.String())), nil
|
|
}
|
|
|
|
// UnmarshalJSON implements the json.Unmarshaller interface.
|
|
func (bts *BootstrapTokenString) UnmarshalJSON(b []byte) error {
|
|
// If the token is represented as "", just return quickly without an error
|
|
if len(b) == 0 {
|
|
return nil
|
|
}
|
|
|
|
// Remove unnecessary " characters coming from the JSON parser
|
|
token := strings.Replace(string(b), `"`, ``, -1)
|
|
// Convert the string Token to a BootstrapTokenString object
|
|
newbts, err := NewBootstrapTokenString(token)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
bts.ID = newbts.ID
|
|
bts.Secret = newbts.Secret
|
|
return nil
|
|
}
|
|
|
|
// String returns the string representation of the BootstrapTokenString
|
|
func (bts BootstrapTokenString) String() string {
|
|
if len(bts.ID) > 0 && len(bts.Secret) > 0 {
|
|
return bootstraputil.TokenFromIDAndSecret(bts.ID, bts.Secret)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// NewBootstrapTokenString converts the given Bootstrap Token as a string
|
|
// to the BootstrapTokenString object used for serialization/deserialization
|
|
// and internal usage. It also automatically validates that the given token
|
|
// is of the right format
|
|
func NewBootstrapTokenString(token string) (*BootstrapTokenString, error) {
|
|
substrs := bootstraputil.BootstrapTokenRegexp.FindStringSubmatch(token)
|
|
// TODO: Add a constant for the 3 value here, and explain better why it's needed (other than because how the regexp parsin works)
|
|
if len(substrs) != 3 {
|
|
return nil, errors.Errorf("the bootstrap token %q was not of the form %q", token, bootstrapapi.BootstrapTokenPattern)
|
|
}
|
|
|
|
return &BootstrapTokenString{ID: substrs[1], Secret: substrs[2]}, nil
|
|
}
|
|
|
|
// NewBootstrapTokenStringFromIDAndSecret is a wrapper around NewBootstrapTokenString
|
|
// that allows the caller to specify the ID and Secret separately
|
|
func NewBootstrapTokenStringFromIDAndSecret(id, secret string) (*BootstrapTokenString, error) {
|
|
return NewBootstrapTokenString(bootstraputil.TokenFromIDAndSecret(id, secret))
|
|
}
|