Skip to content

Commit

Permalink
Merge pull request #49 from deads2k/rebase-1.9.0-beta.1
Browse files Browse the repository at this point in the history
1.9 beta1 rebase
  • Loading branch information
deads2k committed Dec 1, 2017
2 parents 5898890 + 1056bfd commit cfa4949
Show file tree
Hide file tree
Showing 52 changed files with 402 additions and 195 deletions.
16 changes: 11 additions & 5 deletions cmd/kube-controller-manager/app/controllermanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,9 @@ func Run(s *options.CMServer) error {
return err
}

go startHTTP(s)
if s.Port >= 0 {
go startHTTP(s)
}

recorder := createRecorder(kubeClient)

Expand Down Expand Up @@ -155,7 +157,11 @@ func Run(s *options.CMServer) error {
glog.Fatalf("error starting controllers: %v", err)
}

ctx.InformerFactory.Start(ctx.Stop)
if StartInformers == nil {
ctx.InformerFactory.Start(ctx.Stop)
} else {
StartInformers(ctx.Stop)
}
close(ctx.InformersStarted)

select {}
Expand Down Expand Up @@ -373,7 +379,7 @@ func GetAvailableResources(clientBuilder controller.ControllerClientBuilder) (ma
var healthzContent string
// If apiserver is not running we should wait for some time and fail only then. This is particularly
// important when we start apiserver and controller manager at the same time.
err := wait.PollImmediate(time.Second, 10*time.Second, func() (bool, error) {
err := wait.PollImmediate(time.Second, 5*time.Minute, func() (bool, error) {
client, err := clientBuilder.Client("controller-discovery")
if err != nil {
glog.Errorf("Failed to get api versions from server: %v", err)
Expand Down Expand Up @@ -418,10 +424,10 @@ func GetAvailableResources(clientBuilder controller.ControllerClientBuilder) (ma
return allResources, nil
}

// CreateControllerContext creates a context struct containing references to resources needed by the
// createControllerContext creates a context struct containing references to resources needed by the
// controllers such as the cloud provider and clientBuilder. rootClientBuilder is only used for
// the shared-informers client and token controller.
func CreateControllerContext(s *options.CMServer, rootClientBuilder, clientBuilder controller.ControllerClientBuilder, stop <-chan struct{}) (ControllerContext, error) {
func createControllerContext(s *options.CMServer, rootClientBuilder, clientBuilder controller.ControllerClientBuilder, stop <-chan struct{}) (ControllerContext, error) {
versionedClient := rootClientBuilder.ClientOrDie("shared-informers")
sharedInformers := informers.NewSharedInformerFactory(versionedClient, ResyncPeriod(s)())

Expand Down
12 changes: 12 additions & 0 deletions cmd/kube-controller-manager/app/patch.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package app

import (
"k8s.io/kubernetes/cmd/kube-controller-manager/app/options"
"k8s.io/kubernetes/pkg/controller"
)

// This allows overriding from inside the same process. It's not pretty, but its fairly easy to maintain because conflicts are small.
var CreateControllerContext func(s *options.CMServer, rootClientBuilder, clientBuilder controller.ControllerClientBuilder, stop <-chan struct{}) (ControllerContext, error) = createControllerContext

// StartInformers allows overriding inside of the same process.
var StartInformers func(stop <-chan struct{}) = nil
6 changes: 3 additions & 3 deletions pkg/api/testing/serialization_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,13 @@ package testing
import (
"bytes"
"encoding/hex"
"encoding/json"
"io/ioutil"
"math/rand"
"reflect"
"strings"
"testing"

"github.com/golang/protobuf/proto"
jsoniter "github.com/json-iterator/go"

"k8s.io/api/core/v1"
"k8s.io/api/extensions/v1beta1"
Expand All @@ -41,6 +39,7 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer/streaming"
"k8s.io/apimachinery/pkg/util/diff"
"k8s.io/apimachinery/pkg/util/json"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/kubernetes/pkg/api/legacyscheme"
Expand Down Expand Up @@ -562,7 +561,8 @@ func BenchmarkDecodeIntoJSONCodecGen(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
obj := v1.Pod{}
if err := jsoniter.ConfigFastest.Unmarshal(encoded[i%width], &obj); err != nil {
//if err := jsoniter.ConfigFastest.Unmarshal(encoded[i%width], &obj); err != nil {
if err := json.Unmarshal(encoded[i%width], &obj); err != nil {
b.Fatal(err)
}
}
Expand Down
3 changes: 3 additions & 0 deletions pkg/apis/batch/install/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ import (
"k8s.io/kubernetes/pkg/apis/batch/v1"
"k8s.io/kubernetes/pkg/apis/batch/v1beta1"
"k8s.io/kubernetes/pkg/apis/batch/v2alpha1"

// force determinstic ordering when loading these packages
_ "k8s.io/kubernetes/pkg/apis/extensions/install"
)

func init() {
Expand Down
2 changes: 1 addition & 1 deletion pkg/controller/client_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ func (b SAControllerClientBuilder) Config(name string) (*restclient.Config, erro
return b.CoreClient.Secrets(b.Namespace).Watch(options)
},
}
_, err = cache.ListWatchUntil(30*time.Second, lw,
_, err = cache.ListWatchUntil(2*time.Minute, lw,
func(event watch.Event) (bool, error) {
switch event.Type {
case watch.Deleted:
Expand Down
6 changes: 3 additions & 3 deletions pkg/controller/node/scheduler/timed_workers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ func TestExecuteDelayed(t *testing.T) {
return nil
})
now := time.Now()
then := now.Add(3 * time.Second)
then := now.Add(10 * time.Second)
queue.AddWork(NewWorkArgs("1", "1"), now, then)
queue.AddWork(NewWorkArgs("2", "2"), now, then)
queue.AddWork(NewWorkArgs("3", "3"), now, then)
Expand Down Expand Up @@ -89,7 +89,7 @@ func TestCancel(t *testing.T) {
return nil
})
now := time.Now()
then := now.Add(3 * time.Second)
then := now.Add(10 * time.Second)
queue.AddWork(NewWorkArgs("1", "1"), now, then)
queue.AddWork(NewWorkArgs("2", "2"), now, then)
queue.AddWork(NewWorkArgs("3", "3"), now, then)
Expand Down Expand Up @@ -119,7 +119,7 @@ func TestCancelAndReadd(t *testing.T) {
return nil
})
now := time.Now()
then := now.Add(3 * time.Second)
then := now.Add(10 * time.Second)
queue.AddWork(NewWorkArgs("1", "1"), now, then)
queue.AddWork(NewWorkArgs("2", "2"), now, then)
queue.AddWork(NewWorkArgs("3", "3"), now, then)
Expand Down
32 changes: 23 additions & 9 deletions pkg/controller/serviceaccount/tokens_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ import (
"k8s.io/kubernetes/pkg/util/metrics"
)

const ServiceServingCASecretKey = "service-ca.crt"

// RemoveTokenBackoff is the recommended (empirical) retry interval for removing
// a secret reference from a service account when the secret is deleted. It is
// exported for use by custom secret controllers.
Expand All @@ -67,6 +69,9 @@ type TokensControllerOptions struct {
// MaxRetries controls the maximum number of times a particular key is retried before giving up
// If zero, a default max is used
MaxRetries int

// This CA will be added in the secrets of service accounts
ServiceServingCA []byte
}

// NewTokensController returns a new *TokensController.
Expand All @@ -77,9 +82,10 @@ func NewTokensController(serviceAccounts informers.ServiceAccountInformer, secre
}

e := &TokensController{
client: cl,
token: options.TokenGenerator,
rootCA: options.RootCA,
client: cl,
token: options.TokenGenerator,
rootCA: options.RootCA,
serviceServingCA: options.ServiceServingCA,

syncServiceAccountQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "serviceaccount_tokens_service"),
syncSecretQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "serviceaccount_tokens_secret"),
Expand Down Expand Up @@ -134,7 +140,8 @@ type TokensController struct {
client clientset.Interface
token serviceaccount.TokenGenerator

rootCA []byte
rootCA []byte
serviceServingCA []byte

serviceAccounts listersv1.ServiceAccountLister
// updatedSecrets is a wrapper around the shared cache which allows us to record
Expand Down Expand Up @@ -405,6 +412,9 @@ func (e *TokensController) ensureReferencedToken(serviceAccount *v1.ServiceAccou
if e.rootCA != nil && len(e.rootCA) > 0 {
secret.Data[v1.ServiceAccountRootCAKey] = e.rootCA
}
if e.serviceServingCA != nil && len(e.serviceServingCA) > 0 {
secret.Data[ServiceServingCASecretKey] = e.serviceServingCA
}

// Save the secret
createdToken, err := e.client.CoreV1().Secrets(serviceAccount.Namespace).Create(secret)
Expand Down Expand Up @@ -494,22 +504,23 @@ func (e *TokensController) hasReferencedToken(serviceAccount *v1.ServiceAccount)
return false, nil
}

func (e *TokensController) secretUpdateNeeded(secret *v1.Secret) (bool, bool, bool) {
func (e *TokensController) secretUpdateNeeded(secret *v1.Secret) (bool, bool, bool, bool) {
caData := secret.Data[v1.ServiceAccountRootCAKey]
needsCA := len(e.rootCA) > 0 && bytes.Compare(caData, e.rootCA) != 0
needsServiceServingCA := len(e.serviceServingCA) > 0 && bytes.Compare(secret.Data[ServiceServingCASecretKey], e.serviceServingCA) != 0

needsNamespace := len(secret.Data[v1.ServiceAccountNamespaceKey]) == 0

tokenData := secret.Data[v1.ServiceAccountTokenKey]
needsToken := len(tokenData) == 0

return needsCA, needsNamespace, needsToken
return needsCA, needsServiceServingCA, needsNamespace, needsToken
}

// generateTokenIfNeeded populates the token data for the given Secret if not already set
func (e *TokensController) generateTokenIfNeeded(serviceAccount *v1.ServiceAccount, cachedSecret *v1.Secret) ( /* retry */ bool, error) {
// Check the cached secret to see if changes are needed
if needsCA, needsNamespace, needsToken := e.secretUpdateNeeded(cachedSecret); !needsCA && !needsToken && !needsNamespace {
if needsCA, needsServiceServingCA, needsNamespace, needsToken := e.secretUpdateNeeded(cachedSecret); !needsCA && !needsServiceServingCA && !needsToken && !needsNamespace {
return false, nil
}

Expand All @@ -528,8 +539,8 @@ func (e *TokensController) generateTokenIfNeeded(serviceAccount *v1.ServiceAccou
return false, nil
}

needsCA, needsNamespace, needsToken := e.secretUpdateNeeded(liveSecret)
if !needsCA && !needsToken && !needsNamespace {
needsCA, needsServiceServingCA, needsNamespace, needsToken := e.secretUpdateNeeded(liveSecret)
if !needsCA && !needsServiceServingCA && !needsToken && !needsNamespace {
return false, nil
}

Expand All @@ -544,6 +555,9 @@ func (e *TokensController) generateTokenIfNeeded(serviceAccount *v1.ServiceAccou
if needsCA {
liveSecret.Data[v1.ServiceAccountRootCAKey] = e.rootCA
}
if needsServiceServingCA {
liveSecret.Data[ServiceServingCASecretKey] = e.serviceServingCA
}
// Set the namespace
if needsNamespace {
liveSecret.Data[v1.ServiceAccountNamespaceKey] = []byte(liveSecret.Namespace)
Expand Down
12 changes: 10 additions & 2 deletions pkg/kubectl/cmd/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,13 @@ func asVersionedObject(infos []*resource.Info, forceList bool, version schema.Gr
object = objects[0]
} else {
object = &api.List{Items: objects}
converted, err := tryConvert(scheme.Scheme, object, version, scheme.Registry.GroupOrDie(api.GroupName).GroupVersion)
targetVersions := []schema.GroupVersion{}
if !version.Empty() {
targetVersions = append(targetVersions, version)
}
targetVersions = append(targetVersions, scheme.Registry.GroupOrDie(api.GroupName).GroupVersion)

converted, err := tryConvert(scheme.Scheme, object, targetVersions...)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -258,6 +264,7 @@ func asVersionedObjects(infos []*resource.Info, version schema.GroupVersion, enc
continue
}

targetVersions := []schema.GroupVersion{}
// objects that are not part of api.Scheme must be converted to JSON
// TODO: convert to map[string]interface{}, attach to runtime.Unknown?
if !version.Empty() {
Expand All @@ -271,9 +278,10 @@ func asVersionedObjects(infos []*resource.Info, version schema.GroupVersion, enc
objects = append(objects, &runtime.Unknown{Raw: data})
continue
}
targetVersions = append(targetVersions, version)
}

converted, err := tryConvert(info.Mapping.ObjectConvertor, info.Object, version, info.Mapping.GroupVersionKind.GroupVersion())
converted, err := tryConvert(info.Mapping.ObjectConvertor, info.Object, targetVersions...)
if err != nil {
return nil, err
}
Expand Down
21 changes: 19 additions & 2 deletions pkg/kubectl/cmd/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,15 +94,24 @@ type RunObject struct {
Mapping *meta.RESTMapping
}

type RunOptions struct {
DefaultRestartAlwaysGenerator string
DefaultGenerator string
}

func NewCmdRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer) *cobra.Command {
return NewCmdRunWithOptions(f, nil, cmdIn, cmdOut, cmdErr)
}

func NewCmdRunWithOptions(f cmdutil.Factory, opts *RunOptions, cmdIn io.Reader, cmdOut, cmdErr io.Writer) *cobra.Command {
cmd := &cobra.Command{
Use: "run NAME --image=image [--env=\"key=value\"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...]",
Short: i18n.T("Run a particular image on the cluster"),
Long: runLong,
Example: runExample,
Run: func(cmd *cobra.Command, args []string) {
argsLenAtDash := cmd.ArgsLenAtDash()
err := RunRun(f, cmdIn, cmdOut, cmdErr, cmd, args, argsLenAtDash)
err := RunRun(f, opts, cmdIn, cmdOut, cmdErr, cmd, args, argsLenAtDash)
cmdutil.CheckErr(err)
},
}
Expand Down Expand Up @@ -144,7 +153,7 @@ func addRunFlags(cmd *cobra.Command) {
cmd.Flags().String("schedule", "", i18n.T("A schedule in the Cron format the job should be run with."))
}

func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cobra.Command, args []string, argsLenAtDash int) error {
func RunRun(f cmdutil.Factory, opts *RunOptions, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cobra.Command, args []string, argsLenAtDash int) error {
// Let kubectl run follow rules for `--`, see #13004 issue
if len(args) == 0 || argsLenAtDash == 0 {
return cmdutil.UsageErrorf(cmd, "NAME is required for run")
Expand Down Expand Up @@ -228,6 +237,14 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c
generatorName = cmdutil.CronJobV2Alpha1GeneratorName
}
}
if len(generatorName) == 0 && opts != nil {
switch {
case restartPolicy == api.RestartPolicyAlways:
generatorName = opts.DefaultRestartAlwaysGenerator
default:
generatorName = opts.DefaultGenerator
}
}
if len(generatorName) == 0 {
switch restartPolicy {
case api.RestartPolicyAlways:
Expand Down
4 changes: 2 additions & 2 deletions pkg/kubectl/cmd/run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ func TestRunArgsFollowDashRules(t *testing.T) {
cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr)
cmd.Flags().Set("image", "nginx")
cmd.Flags().Set("generator", "run/v1")
err := RunRun(f, os.Stdin, os.Stdout, os.Stderr, cmd, test.args, test.argsLenAtDash)
err := RunRun(f, nil, os.Stdin, os.Stdout, os.Stderr, cmd, test.args, test.argsLenAtDash)
if test.expectError && err == nil {
t.Errorf("unexpected non-error (%s)", test.name)
}
Expand Down Expand Up @@ -447,7 +447,7 @@ func TestRunValidations(t *testing.T) {
for flagName, flagValue := range test.flags {
cmd.Flags().Set(flagName, flagValue)
}
err := RunRun(f, inBuf, outBuf, errBuf, cmd, test.args, cmd.ArgsLenAtDash())
err := RunRun(f, nil, inBuf, outBuf, errBuf, cmd, test.args, cmd.ArgsLenAtDash())
if err != nil && len(test.expectedErr) > 0 {
if !strings.Contains(err.Error(), test.expectedErr) {
t.Errorf("unexpected error: %v", err)
Expand Down
7 changes: 7 additions & 0 deletions pkg/kubectl/cmd/util/factory_object_mapping.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,13 @@ func (f *ring1Factory) LogsForObject(object, options runtime.Object, timeout tim
return nil, fmt.Errorf("invalid label selector: %v", err)
}

case *extensions.DaemonSet:
namespace = t.Namespace
selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector)
if err != nil {
return nil, fmt.Errorf("invalid label selector: %v", err)
}

case *batch.Job:
namespace = t.Namespace
selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector)
Expand Down

0 comments on commit cfa4949

Please sign in to comment.