Skip to content

Commit ee05326

Browse files
committed
update idle command
1 parent c0fa296 commit ee05326

File tree

4 files changed

+67
-56
lines changed

4 files changed

+67
-56
lines changed

pkg/cmd/openshift-controller-manager/controller/unidling.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
appsclient "github.com/openshift/origin/pkg/apps/generated/internalclientset/typed/apps/internalversion"
99
"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
1010
unidlingcontroller "github.com/openshift/origin/pkg/unidling/controller"
11+
kubernetes "k8s.io/client-go/kubernetes/typed/core/v1"
1112
)
1213

1314
func RunUnidlingController(ctx ControllerContext) (bool, error) {
@@ -20,6 +21,11 @@ func RunUnidlingController(ctx ControllerContext) (bool, error) {
2021
return false, err
2122
}
2223

24+
coreV1Client, err := kubernetes.NewForConfig(clientConfig)
25+
if err != nil {
26+
return false, err
27+
}
28+
2329
scaleNamespacer := appsv1client.NewDelegatingScaleNamespacer(appsClient,
2430
ctx.ClientBuilder.ClientOrDie(bootstrappolicy.InfraUnidlingControllerServiceAccountName).ExtensionsV1beta1())
2531

@@ -29,7 +35,7 @@ func RunUnidlingController(ctx ControllerContext) (bool, error) {
2935
coreClient,
3036
coreClient,
3137
appsclient.NewForConfigOrDie(ctx.ClientBuilder.ConfigOrDie(bootstrappolicy.InfraUnidlingControllerServiceAccountName)),
32-
coreClient,
38+
coreV1Client,
3339
resyncPeriod,
3440
)
3541

pkg/oc/cli/idle/idle.go

+48-44
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@ import (
1111
"github.com/spf13/cobra"
1212

1313
utilerrors "github.com/openshift/origin/pkg/util/errors"
14+
corev1 "k8s.io/api/core/v1"
1415
extensions "k8s.io/api/extensions/v1beta1"
1516
"k8s.io/apimachinery/pkg/api/meta"
1617
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1718
"k8s.io/apimachinery/pkg/runtime"
1819
"k8s.io/apimachinery/pkg/runtime/schema"
1920
"k8s.io/apimachinery/pkg/types"
2021
"k8s.io/apimachinery/pkg/util/strategicpatch"
22+
"k8s.io/client-go/kubernetes"
2123
kextensionsclient "k8s.io/client-go/kubernetes/typed/extensions/v1beta1"
2224
"k8s.io/client-go/rest"
2325
"k8s.io/kubernetes/pkg/api/legacyscheme"
24-
kapi "k8s.io/kubernetes/pkg/apis/core"
25-
kinternalclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
2626
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
2727
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
2828
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
@@ -54,23 +54,23 @@ var (
5454
)
5555

5656
type IdleOptions struct {
57-
dryRun bool
58-
57+
dryRun bool
5958
filename string
6059
all bool
6160
selector string
6261
allNamespaces bool
63-
resources string
62+
resources []string
6463

6564
cmdFullName string
6665

6766
ClientForMappingFn func(*meta.RESTMapping) (resource.RESTClient, error)
6867
ClientConfig *rest.Config
69-
ClientSet kinternalclientset.Interface
68+
ClientSet kubernetes.Interface
7069
Mapper meta.RESTMapper
7170

72-
nowTime time.Time
73-
svcBuilder *resource.Builder
71+
Builder func() *resource.Builder
72+
Namespace string
73+
nowTime time.Time
7474

7575
genericclioptions.IOStreams
7676
}
@@ -110,7 +110,8 @@ func NewCmdIdle(fullName string, f kcmdutil.Factory, streams genericclioptions.I
110110
}
111111

112112
func (o *IdleOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []string) error {
113-
namespace, _, err := f.ToRawKubeConfigLoader().Namespace()
113+
var err error
114+
o.Namespace, _, err = f.ToRawKubeConfigLoader().Namespace()
114115
if err != nil {
115116
return err
116117
}
@@ -127,7 +128,7 @@ func (o *IdleOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []st
127128
return err
128129
}
129130

130-
o.ClientSet, err = f.ClientSet()
131+
o.ClientSet, err = kubernetes.NewForConfig(o.ClientConfig)
131132
if err != nil {
132133
return err
133134
}
@@ -138,32 +139,9 @@ func (o *IdleOptions) Complete(f kcmdutil.Factory, cmd *cobra.Command, args []st
138139
}
139140

140141
o.ClientForMappingFn = f.ClientForMapping
142+
o.Builder = f.NewBuilder
141143

142-
o.svcBuilder = f.NewBuilder().
143-
WithScheme(ocscheme.ReadingInternalScheme).
144-
ContinueOnError().
145-
NamespaceParam(namespace).DefaultNamespace().AllNamespaces(o.allNamespaces).
146-
Flatten().
147-
SingleResourceType()
148-
149-
if len(o.filename) > 0 {
150-
targetServiceNames, err := scanLinesFromFile(o.filename)
151-
if err != nil {
152-
return err
153-
}
154-
o.svcBuilder.ResourceNames("endpoints", targetServiceNames...)
155-
} else {
156-
// NB: this is a bit weird because the resource builder will complain if we use ResourceTypes and ResourceNames when len(args) > 0
157-
if o.selector != "" {
158-
o.svcBuilder.LabelSelectorParam(o.selector).ResourceTypes("endpoints")
159-
}
160-
161-
o.svcBuilder.ResourceNames("endpoints", args...)
162-
163-
if o.all {
164-
o.svcBuilder.ResourceTypes("endpoints").SelectAllParam(o.all)
165-
}
166-
}
144+
o.resources = args
167145

168146
return nil
169147
}
@@ -206,7 +184,7 @@ func scanLinesFromFile(filename string) ([]string, error) {
206184
// idleUpdateInfo contains the required info to annotate an endpoints object
207185
// with the scalable resources that it should unidle
208186
type idleUpdateInfo struct {
209-
obj *kapi.Endpoints
187+
obj *corev1.Endpoints
210188
scaleRefs map[unidlingapi.CrossGroupObjectReference]struct{}
211189
}
212190

@@ -224,9 +202,9 @@ type controllerRef struct {
224202
// Using the list of services, it figures out the associated scalable objects, and returns a map from the endpoints object for the services to
225203
// the list of scalable resources associated with that endpoints object, as well as a map from CrossGroupObjectReferences to scale to 0 to the
226204
// name of the associated service.
227-
func (o *IdleOptions) calculateIdlableAnnotationsByService() (map[types.NamespacedName]idleUpdateInfo, map[namespacedCrossGroupObjectReference]types.NamespacedName, error) {
228-
podsLoaded := make(map[kapi.ObjectReference]*kapi.Pod)
229-
getPod := func(ref kapi.ObjectReference) (*kapi.Pod, error) {
205+
func (o *IdleOptions) calculateIdlableAnnotationsByService(infoVisitor func(resource.VisitorFunc) error) (map[types.NamespacedName]idleUpdateInfo, map[namespacedCrossGroupObjectReference]types.NamespacedName, error) {
206+
podsLoaded := make(map[corev1.ObjectReference]*corev1.Pod)
207+
getPod := func(ref corev1.ObjectReference) (*corev1.Pod, error) {
230208
if pod, ok := podsLoaded[ref]; ok {
231209
return pod, nil
232210
}
@@ -287,12 +265,12 @@ func (o *IdleOptions) calculateIdlableAnnotationsByService() (map[types.Namespac
287265
targetScaleRefs := make(map[namespacedCrossGroupObjectReference]types.NamespacedName)
288266
endpointsInfo := make(map[types.NamespacedName]idleUpdateInfo)
289267

290-
err := o.svcBuilder.Do().Visit(func(info *resource.Info, err error) error {
268+
err := infoVisitor(func(info *resource.Info, err error) error {
291269
if err != nil {
292270
return err
293271
}
294272

295-
endpoints, isEndpoints := info.Object.(*kapi.Endpoints)
273+
endpoints, isEndpoints := info.Object.(*corev1.Endpoints)
296274
if !isEndpoints {
297275
return fmt.Errorf("you must specify endpoints, not %v (view available endpoints with \"%s get endpoints\").", info.Mapping.Resource, o.cmdFullName)
298276
}
@@ -372,9 +350,9 @@ func normalizedNSOwnerRef(namespace string, ownerRef *metav1.OwnerReference) nam
372350
// scalable objects by checking each address in each subset to see if it has a pod
373351
// reference, and the following that pod reference to find the owning controller,
374352
// and returning the unique set of controllers found this way.
375-
func findScalableResourcesForEndpoints(endpoints *kapi.Endpoints, getPod func(kapi.ObjectReference) (*kapi.Pod, error), getController func(namespacedOwnerReference) (metav1.Object, error)) (map[namespacedCrossGroupObjectReference]struct{}, error) {
353+
func findScalableResourcesForEndpoints(endpoints *corev1.Endpoints, getPod func(corev1.ObjectReference) (*corev1.Pod, error), getController func(namespacedOwnerReference) (metav1.Object, error)) (map[namespacedCrossGroupObjectReference]struct{}, error) {
376354
// To find all RCs and DCs for an endpoint, we first figure out which pods are pointed to by that endpoint...
377-
podRefs := map[kapi.ObjectReference]*kapi.Pod{}
355+
podRefs := map[corev1.ObjectReference]*corev1.Pod{}
378356
for _, subset := range endpoints.Subsets {
379357
for _, addr := range subset.Addresses {
380358
if addr.TargetRef != nil && addr.TargetRef.Kind == "Pod" {
@@ -547,6 +525,32 @@ type scaleInfo struct {
547525
// scalable resources to zero, and annotating the associated endpoints objects with the scalable resources to unidle
548526
// when they receive traffic.
549527
func (o *IdleOptions) RunIdle() error {
528+
b := o.Builder().
529+
WithScheme(ocscheme.ReadingInternalScheme, ocscheme.ReadingInternalScheme.PrioritizedVersionsAllGroups()...).
530+
ContinueOnError().
531+
NamespaceParam(o.Namespace).DefaultNamespace().AllNamespaces(o.allNamespaces).
532+
Flatten().
533+
SingleResourceType()
534+
535+
if len(o.filename) > 0 {
536+
targetServiceNames, err := scanLinesFromFile(o.filename)
537+
if err != nil {
538+
return err
539+
}
540+
b.ResourceNames("endpoints", targetServiceNames...)
541+
} else {
542+
// NB: this is a bit weird because the resource builder will complain if we use ResourceTypes and ResourceNames when len(args) > 0
543+
if o.selector != "" {
544+
b.LabelSelectorParam(o.selector).ResourceTypes("endpoints")
545+
}
546+
547+
b.ResourceNames("endpoints", o.resources...)
548+
549+
if o.all {
550+
b.ResourceTypes("endpoints").SelectAllParam(o.all)
551+
}
552+
}
553+
550554
hadError := false
551555
nowTime := time.Now().UTC()
552556

@@ -556,7 +560,7 @@ func (o *IdleOptions) RunIdle() error {
556560
}
557561

558562
// figure out which endpoints and resources we need to idle
559-
byService, byScalable, err := o.calculateIdlableAnnotationsByService()
563+
byService, byScalable, err := o.calculateIdlableAnnotationsByService(b.Do().Visit)
560564

561565
if err != nil {
562566
if len(byService) == 0 || len(byScalable) == 0 {

pkg/unidling/controller/unidling_controller.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"k8s.io/apimachinery/pkg/runtime"
2121
"k8s.io/apimachinery/pkg/types"
2222
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
23+
kubernetes "k8s.io/client-go/kubernetes/typed/core/v1"
2324
kextclient "k8s.io/client-go/kubernetes/typed/extensions/v1beta1"
2425
"k8s.io/client-go/tools/cache"
2526
kcoreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
@@ -73,10 +74,10 @@ type UnidlingController struct {
7374

7475
// TODO: remove these once we get the scale-source functionality in the scale endpoints
7576
dcNamespacer appsclient.DeploymentConfigsGetter
76-
rcNamespacer kcoreclient.ReplicationControllersGetter
77+
rcNamespacer kubernetes.ReplicationControllersGetter
7778
}
7879

79-
func NewUnidlingController(scaleNS kextclient.ScalesGetter, endptsNS kcoreclient.EndpointsGetter, evtNS kcoreclient.EventsGetter, dcNamespacer appsclient.DeploymentConfigsGetter, rcNamespacer kcoreclient.ReplicationControllersGetter, resyncPeriod time.Duration) *UnidlingController {
80+
func NewUnidlingController(scaleNS kextclient.ScalesGetter, endptsNS kcoreclient.EndpointsGetter, evtNS kcoreclient.EventsGetter, dcNamespacer appsclient.DeploymentConfigsGetter, rcNamespacer kubernetes.ReplicationControllersGetter, resyncPeriod time.Duration) *UnidlingController {
8081
fieldSet := fields.Set{}
8182
fieldSet["reason"] = unidlingapi.NeedPodsReason
8283
fieldSelector := fieldSet.AsSelector()

pkg/unidling/util/scale.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ package util
33
import (
44
"github.com/golang/glog"
55

6-
kapiv1 "k8s.io/api/core/v1"
6+
corev1 "k8s.io/api/core/v1"
77
kextapi "k8s.io/api/extensions/v1beta1"
88
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
99
"k8s.io/apimachinery/pkg/runtime"
1010
"k8s.io/apimachinery/pkg/types"
1111
"k8s.io/apimachinery/pkg/util/strategicpatch"
12+
kubernetes "k8s.io/client-go/kubernetes/typed/core/v1"
1213
kextensionsclient "k8s.io/client-go/kubernetes/typed/extensions/v1beta1"
1314
kapi "k8s.io/kubernetes/pkg/apis/core"
14-
kcoreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
1515

1616
appsapiv1 "github.com/openshift/api/apps/v1"
1717
"github.com/openshift/origin/pkg/api/legacy"
@@ -25,7 +25,7 @@ import (
2525

2626
type AnnotationFunc func(currentReplicas int32, annotations map[string]string)
2727

28-
func NewScaleAnnotater(scales kextensionsclient.ScalesGetter, dcs appsclient.DeploymentConfigsGetter, rcs kcoreclient.ReplicationControllersGetter, changeAnnots AnnotationFunc) *ScaleAnnotater {
28+
func NewScaleAnnotater(scales kextensionsclient.ScalesGetter, dcs appsclient.DeploymentConfigsGetter, rcs kubernetes.ReplicationControllersGetter, changeAnnots AnnotationFunc) *ScaleAnnotater {
2929
return &ScaleAnnotater{
3030
scales: scales,
3131
dcs: dcs,
@@ -37,7 +37,7 @@ func NewScaleAnnotater(scales kextensionsclient.ScalesGetter, dcs appsclient.Dep
3737
type ScaleAnnotater struct {
3838
scales kextensionsclient.ScalesGetter
3939
dcs appsclient.DeploymentConfigsGetter
40-
rcs kcoreclient.ReplicationControllersGetter
40+
rcs kubernetes.ReplicationControllersGetter
4141
ChangeAnnotations AnnotationFunc
4242
}
4343

@@ -51,10 +51,10 @@ type scaleUpdater struct {
5151
encoder runtime.Encoder
5252
namespace string
5353
dcGetter appsclient.DeploymentConfigsGetter
54-
rcGetter kcoreclient.ReplicationControllersGetter
54+
rcGetter kubernetes.ReplicationControllersGetter
5555
}
5656

57-
func NewScaleUpdater(encoder runtime.Encoder, namespace string, dcGetter appsclient.DeploymentConfigsGetter, rcGetter kcoreclient.ReplicationControllersGetter) ScaleUpdater {
57+
func NewScaleUpdater(encoder runtime.Encoder, namespace string, dcGetter appsclient.DeploymentConfigsGetter, rcGetter kubernetes.ReplicationControllersGetter) ScaleUpdater {
5858
return scaleUpdater{
5959
encoder: encoder,
6060
namespace: namespace,
@@ -107,7 +107,7 @@ func (s scaleUpdater) Update(annotator *ScaleAnnotater, obj runtime.Object, scal
107107
return err
108108
}
109109

110-
patchBytes, err = strategicpatch.CreateTwoWayMergePatch(originalObj, newObj, &kapiv1.ReplicationController{})
110+
patchBytes, err = strategicpatch.CreateTwoWayMergePatch(originalObj, newObj, &corev1.ReplicationController{})
111111
if err != nil {
112112
return err
113113
}
@@ -136,13 +136,13 @@ func (c *ScaleAnnotater) GetObjectWithScale(namespace string, ref unidlingapi.Cr
136136
}
137137
obj = dc
138138
case ref.Kind == "ReplicationController" && ref.Group == kapi.GroupName:
139-
var rc *kapi.ReplicationController
139+
var rc *corev1.ReplicationController
140140
rc, err = c.rcs.ReplicationControllers(namespace).Get(ref.Name, metav1.GetOptions{})
141141
if err != nil {
142142
return nil, nil, err
143143
}
144144
scale = &kextapi.Scale{
145-
Spec: kextapi.ScaleSpec{Replicas: rc.Spec.Replicas},
145+
Spec: kextapi.ScaleSpec{Replicas: *rc.Spec.Replicas},
146146
}
147147
obj = rc
148148
default:

0 commit comments

Comments
 (0)