Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can &deployment satisfy type runtime.Object in kubernetes code?

In kubectl/run.go in Kubernetes code, the Generate function has a result list of these two types:

runtime.Object, error

The last line of the function is:

return &deployment, nil

runtime is imported:

k8s.io/apimachinery/pkg/runtime

I got runtime by running go get on that import statement, and Object is defined in interfaces.go:

type Object interface {
    GetObjectKind() schema.ObjectKind
    DeepCopyObject() Object
}

(And I found the same code on the web here.)

The address operator creates a pointer... more specifically, the Go spec states:

For an operand x of type T, the address operation &x generates a pointer of type *T to x.

and pointers have a type distinct from their base type:

A pointer type denotes the set of all pointers to variables of a given type, called the base type of the pointer.

How does &deployment satisfy the runtime.Object type?

My best guess so far is that deployment implements the runtime.Object interface, and mapping &deployment to runtime.Object satisfies this rule of assignability:

T is an interface type and x implements T.

and that a return statement mapping to a result list type is equivalent to assignment in this respect. Is this correct? If not, is there another part of the specification or documentation that explains it?

like image 842
jrefior Avatar asked Mar 07 '23 21:03

jrefior


1 Answers

deployment is a local variable, its declaration:

deployment := extensionsv1beta1.Deployment{
    // ...
}

Where extensionsv1beta1 from the imports:

import (
    // ...
    extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
    // ...
)

Doc of extensionsv1beta1.Deployment. Its definition is:

type Deployment struct {
    metav1.TypeMeta `json:",inline"`
    // ...other fields...
}

It embeds metav1.TypeMeta, which has a method GetObjectKind() method with pointer receiver. This means a pointer to Deployment also has this method, because Spec: Struct types:

Given a struct type S and a defined type T, promoted methods are included in the method set of the struct as follows:

  • If S contains an embedded field T, the method sets of S and *S both include promoted methods with receiver T. The method set of *S also includes promoted methods with receiver *T.

And Deployment has a "direct" DeepCopyObject() method, again with pointer receiver. So the method set of *Deployment contains this method.

And last quoting Spec: Interface types:

An interface type specifies a method set called its interface. A variable of interface type can store a value of any type with a method set that is any superset of the interface. Such a type is said to implement the interface.

So this means the method set of *Deployment has all the methods defined by Object, or in other words: the method set of *Deployment is a superset of the method set of Object, so *Deployment implements Object.

deployment is of type extensionsv1beta1.Deployment, which means &deployment is of type *extensionsv1beta1.Deployment, which we showed above that it implements Object; so the value &deployment can be assigned to or be stored in a variable of type Object.

like image 193
icza Avatar answered Apr 24 '23 00:04

icza