Documentation
¶
Overview ¶
Package v1beta1 contains API Schema definitions for the authentication v1beta1 API group
Index ¶
- Variables
- type AuthParams
- type AuthzPolicy
- type AwsConfig
- type Identity
- type IdentityList
- type IdentitySpec
- type IdentityStatus
- type IdentityType
- type Renew
- type RenewList
- type RenewSpec
- type RenewStatus
- type ResourceSlice
- type ResourceSliceClass
- type ResourceSliceCondition
- type ResourceSliceConditionStatus
- type ResourceSliceConditionType
- type ResourceSliceList
- type ResourceSliceSpec
- type ResourceSliceStatus
- type Tenant
- type TenantCondition
- type TenantList
- type TenantSpec
- type TenantStatus
Constants ¶
This section is empty.
Variables ¶
var ( // GroupVersion is group version used to register these objects. GroupVersion = schema.GroupVersion{Group: "authentication.liqo.io", Version: "v1beta1"} // SchemeBuilder is used to add go types to the GroupVersionKind scheme. SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} // AddToScheme adds the types in this group-version to the given scheme. AddToScheme = SchemeBuilder.AddToScheme )
var IdentityGroupResource = schema.GroupResource{Group: GroupVersion.Group, Resource: IdentityResource}
IdentityGroupResource is group resource used to register these objects.
var IdentityGroupVersionResource = GroupVersion.WithResource(IdentityResource)
IdentityGroupVersionResource is groupResourceVersion used to register these objects.
var IdentityKind = "Identity"
IdentityKind specifies the kind of the identity.
var IdentityResource = "identities"
IdentityResource is the name of the identity resources.
var RenewGroupResource = schema.GroupResource{Group: GroupVersion.Group, Resource: RenewResource}
RenewGroupResource is group resource used to register these objects.
var RenewGroupVersionResource = GroupVersion.WithResource(RenewResource)
RenewGroupVersionResource is groupResourceVersion used to register these objects.
var RenewKind = "Renew"
RenewKind specifies the kind of the renew.
var RenewResource = "renews"
RenewResource is the name of the renew resources.
var ResourceSliceGroupResource = schema.GroupResource{Group: GroupVersion.Group, Resource: ResourceSliceResource}
ResourceSliceGroupResource is group resource used to register these objects.
var ResourceSliceGroupVersionResource = GroupVersion.WithResource(ResourceSliceResource)
ResourceSliceGroupVersionResource is groupResourceVersion used to register these objects.
var ResourceSliceKind = "ResourceSlice"
ResourceSliceKind specifies the kind of the resourceSlice.
var ResourceSliceResource = "resourceslices"
ResourceSliceResource is the name of the resourceSlice resources.
var TenantGroupResource = schema.GroupResource{Group: GroupVersion.Group, Resource: TenantResource}
TenantGroupResource is group resource used to register these objects.
var TenantGroupVersionResource = GroupVersion.WithResource(TenantResource)
TenantGroupVersionResource is groupResourceVersion used to register these objects.
var TenantKind = "Tenant"
TenantKind specifies the kind of the tenant.
var TenantResource = "tenants"
TenantResource is the name of the tenant resources.
Functions ¶
This section is empty.
Types ¶
type AuthParams ¶
type AuthParams struct { CA []byte `json:"ca,omitempty"` SignedCRT []byte `json:"signedCRT,omitempty"` APIServer string `json:"apiServer,omitempty"` ProxyURL *string `json:"proxyURL,omitempty"` AwsConfig *AwsConfig `json:"awsConfig,omitempty"` }
AuthParams contains the authentication parameters for the tenant cluster.
func (*AuthParams) DeepCopy ¶
func (in *AuthParams) DeepCopy() *AuthParams
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuthParams.
func (*AuthParams) DeepCopyInto ¶
func (in *AuthParams) DeepCopyInto(out *AuthParams)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type AuthzPolicy ¶
type AuthzPolicy string
AuthzPolicy is the policy used by the cluster to authorize or reject an incoming ResourceSlice.
const ( // KeysExchange indicates that a keys exchange must be performed before accepting any ResourceSlice. KeysExchange AuthzPolicy = "KeysExchange" // TolerateNoHandshake indicates that the local cluster accepts ResourceSlices even when there // never have been a key exchange with the peer cluster. TolerateNoHandshake AuthzPolicy = "TolerateNoHandshake" // DefaultAuthzPolicy is the default authorization policy if nothing is provided. DefaultAuthzPolicy AuthzPolicy = KeysExchange )
func GetAuthzPolicyValue ¶
func GetAuthzPolicyValue(policy *AuthzPolicy) AuthzPolicy
GetAuthzPolicyValue returns the value of the pointer to an AuthzPolicy type, if the pointer is nil it returns the default value.
type AwsConfig ¶
type AwsConfig struct { AwsUserArn string `json:"awsUserArn"` AwsAccessKeyID string `json:"awsAccessKeyID"` AwsSecretAccessKey string `json:"awsSecretAccessKey"` AwsRegion string `json:"awsRegion"` AwsClusterName string `json:"awsClusterName"` }
AwsConfig contains the AWS configuration and access key for the Liqo user and the current EKS cluster.
func (*AwsConfig) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AwsConfig.
func (*AwsConfig) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type Identity ¶
type Identity struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec IdentitySpec `json:"spec,omitempty"` Status IdentityStatus `json:"status,omitempty"` }
Identity contains the information to operate in a remote cluster.
func (*Identity) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Identity.
func (*Identity) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*Identity) DeepCopyObject ¶
DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
type IdentityList ¶
type IdentityList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty"` Items []Identity `json:"items"` }
IdentityList contains a list of Identities.
func (*IdentityList) DeepCopy ¶
func (in *IdentityList) DeepCopy() *IdentityList
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityList.
func (*IdentityList) DeepCopyInto ¶
func (in *IdentityList) DeepCopyInto(out *IdentityList)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*IdentityList) DeepCopyObject ¶
func (in *IdentityList) DeepCopyObject() runtime.Object
DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
type IdentitySpec ¶
type IdentitySpec struct { // ClusterID is the identity of the provider cluster. ClusterID liqov1beta1.ClusterID `json:"clusterID,omitempty"` // Type is the type of the identity. // +kubebuilder:validation:Enum=ControlPlane;ResourceSlice Type IdentityType `json:"type,omitempty"` // AuthParams contains the parameters to create an Identity to use in the provider cluster. AuthParams AuthParams `json:"authParams,omitempty"` // Namespace is the namespace where to use the identity. // +kubebuilder:validation:Optional Namespace *string `json:"namespace,omitempty"` }
IdentitySpec defines the desired state of Identity.
func (*IdentitySpec) DeepCopy ¶
func (in *IdentitySpec) DeepCopy() *IdentitySpec
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentitySpec.
func (*IdentitySpec) DeepCopyInto ¶
func (in *IdentitySpec) DeepCopyInto(out *IdentitySpec)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type IdentityStatus ¶
type IdentityStatus struct { // KubeconfigSecretRef contains the reference to the secret containing the kubeconfig to access the provider cluster. KubeconfigSecretRef *corev1.LocalObjectReference `json:"kubeconfigSecretRef,omitempty"` }
IdentityStatus defines the observed state of Identity.
func (*IdentityStatus) DeepCopy ¶
func (in *IdentityStatus) DeepCopy() *IdentityStatus
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityStatus.
func (*IdentityStatus) DeepCopyInto ¶
func (in *IdentityStatus) DeepCopyInto(out *IdentityStatus)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type IdentityType ¶
type IdentityType string
IdentityType is the type of the Identity. It can be either "ControlPlane" or "VirtualNode":
- ControlPlane: identity that gives the permissions to replicate resources to the remote cluster through the CrdReplicator.
- VirtualNode: identity that gives the permissions to create a virtual node.
const ( // ControlPlaneIdentityType indicates an Identity of type ControlPlane. ControlPlaneIdentityType IdentityType = "ControlPlane" // ResourceSliceIdentityType indicates an Identity of type ResourceSlice. ResourceSliceIdentityType IdentityType = "ResourceSlice" )
type Renew ¶
type Renew struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec RenewSpec `json:"spec,omitempty"` Status RenewStatus `json:"status,omitempty"` }
Renew represents a slice of resources given by the provider cluster to the consumer cluster.
func (*Renew) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Renew.
func (*Renew) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*Renew) DeepCopyObject ¶
DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
type RenewList ¶
type RenewList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty"` Items []Renew `json:"items"` }
RenewList contains a list of Renews.
func (*RenewList) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RenewList.
func (*RenewList) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*RenewList) DeepCopyObject ¶
DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
type RenewSpec ¶
type RenewSpec struct { // ConsumerClusterID is the id of the consumer cluster. ConsumerClusterID liqov1beta1.ClusterID `json:"consumerClusterID,omitempty"` // PublicKey is the public key of the tenant cluster. PublicKey []byte `json:"publicKey,omitempty"` // CSR is the Certificate Signing Request of the tenant cluster. CSR []byte `json:"csr,omitempty"` // IdentityType is the type of the identity. IdentityType IdentityType `json:"identityType,omitempty"` // ResoruceSliceRef is the reference to the resource slice. ResourceSliceRef *corev1.LocalObjectReference `json:"resourceSliceRef,omitempty"` }
RenewSpec defines the desired state of Renew.
func (*RenewSpec) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RenewSpec.
func (*RenewSpec) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type RenewStatus ¶
type RenewStatus struct { // AuthParams contains the authentication parameters for the consumer cluster. AuthParams *AuthParams `json:"authParams,omitempty"` }
RenewStatus defines the observed state of Renew.
func (*RenewStatus) DeepCopy ¶
func (in *RenewStatus) DeepCopy() *RenewStatus
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RenewStatus.
func (*RenewStatus) DeepCopyInto ¶
func (in *RenewStatus) DeepCopyInto(out *RenewStatus)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type ResourceSlice ¶
type ResourceSlice struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec ResourceSliceSpec `json:"spec,omitempty"` Status ResourceSliceStatus `json:"status,omitempty"` }
ResourceSlice represents a slice of resources given by the provider cluster to the consumer cluster.
func (*ResourceSlice) DeepCopy ¶
func (in *ResourceSlice) DeepCopy() *ResourceSlice
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceSlice.
func (*ResourceSlice) DeepCopyInto ¶
func (in *ResourceSlice) DeepCopyInto(out *ResourceSlice)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*ResourceSlice) DeepCopyObject ¶
func (in *ResourceSlice) DeepCopyObject() runtime.Object
DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
type ResourceSliceClass ¶
type ResourceSliceClass string
ResourceSliceClass is the class of the ResourceSlice.
const ( // ResourceSliceClassUnknown is the unknown class of the ResourceSlice. ResourceSliceClassUnknown ResourceSliceClass = "" // ResourceSliceClassDefault is the default class of the ResourceSlice. ResourceSliceClassDefault ResourceSliceClass = "default" )
type ResourceSliceCondition ¶
type ResourceSliceCondition struct { // Type of the condition. // +kubebuilder:validation:Enum="Authentication";"Resources" Type ResourceSliceConditionType `json:"type"` // Status of the condition. // +kubebuilder:validation:Enum="Accepted";"Denied" Status ResourceSliceConditionStatus `json:"status"` // LastTransitionTime -> timestamp for when the condition last transitioned from one status to another. LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"` // Reason -> Machine-readable, UpperCamelCase text indicating the reason for the condition's last transition. Reason string `json:"reason,omitempty"` // Message -> Human-readable message indicating details about the last status transition. Message string `json:"message,omitempty"` }
ResourceSliceCondition contains details about the status of the provided ResourceSlice.
func (*ResourceSliceCondition) DeepCopy ¶
func (in *ResourceSliceCondition) DeepCopy() *ResourceSliceCondition
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceSliceCondition.
func (*ResourceSliceCondition) DeepCopyInto ¶
func (in *ResourceSliceCondition) DeepCopyInto(out *ResourceSliceCondition)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type ResourceSliceConditionStatus ¶
type ResourceSliceConditionStatus string
ResourceSliceConditionStatus represents different status conditions that a ResourceSlice could assume.
const ( // ResourceSliceConditionAccepted informs users that the resources are available. ResourceSliceConditionAccepted ResourceSliceConditionStatus = "Accepted" // ResourceSliceConditionDenied informs users that the resources are not available. ResourceSliceConditionDenied ResourceSliceConditionStatus = "Denied" )
These are valid conditions of a ResourceSlice.
type ResourceSliceConditionType ¶
type ResourceSliceConditionType string
ResourceSliceConditionType represents different types of conditions that a ResourceSlice could assume.
const ( // ResourceSliceConditionTypeAuthentication informs users that the authentication of the ResourceSlice is in progress. ResourceSliceConditionTypeAuthentication ResourceSliceConditionType = "Authentication" // ResourceSliceConditionTypeResources informs users that the resources of the ResourceSlice are in progress. ResourceSliceConditionTypeResources ResourceSliceConditionType = "Resources" )
type ResourceSliceList ¶
type ResourceSliceList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty"` Items []ResourceSlice `json:"items"` }
ResourceSliceList contains a list of ResourceSlices.
func (*ResourceSliceList) DeepCopy ¶
func (in *ResourceSliceList) DeepCopy() *ResourceSliceList
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceSliceList.
func (*ResourceSliceList) DeepCopyInto ¶
func (in *ResourceSliceList) DeepCopyInto(out *ResourceSliceList)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*ResourceSliceList) DeepCopyObject ¶
func (in *ResourceSliceList) DeepCopyObject() runtime.Object
DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
type ResourceSliceSpec ¶
type ResourceSliceSpec struct { // ConsumerClusterID is the id of the consumer cluster. ConsumerClusterID *liqov1beta1.ClusterID `json:"consumerClusterID,omitempty"` // ProviderClusterID is the id of the provider cluster. ProviderClusterID *liqov1beta1.ClusterID `json:"providerClusterID,omitempty"` // Resources contains the slice of resources requested. Resources corev1.ResourceList `json:"resources,omitempty"` // Class contains the class of the ResourceSlice. Class ResourceSliceClass `json:"class,omitempty"` // CSR is the Certificate Signing Request of the consumer cluster. CSR []byte `json:"csr,omitempty"` }
ResourceSliceSpec defines the desired state of ResourceSlice.
func (*ResourceSliceSpec) DeepCopy ¶
func (in *ResourceSliceSpec) DeepCopy() *ResourceSliceSpec
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceSliceSpec.
func (*ResourceSliceSpec) DeepCopyInto ¶
func (in *ResourceSliceSpec) DeepCopyInto(out *ResourceSliceSpec)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type ResourceSliceStatus ¶
type ResourceSliceStatus struct { // Conditions contains the conditions of the ResourceSlice. Conditions []ResourceSliceCondition `json:"conditions,omitempty"` // Resources contains the slice of resources accepted. Resources corev1.ResourceList `json:"resources,omitempty"` // AuthParams contains the authentication parameters for the resources given by the provider cluster. AuthParams *AuthParams `json:"authParams,omitempty"` // StorageClasses contains the list of the storage classes offered by the cluster. StorageClasses []liqov1beta1.StorageType `json:"storageClasses,omitempty"` // IngressClasses contains the list of the ingress classes offered by the cluster. IngressClasses []liqov1beta1.IngressType `json:"ingressClasses,omitempty"` // LoadBalancerClasses contains the list of the load balancer classes offered by the cluster. LoadBalancerClasses []liqov1beta1.LoadBalancerType `json:"loadBalancerClasses,omitempty"` // NodeLabels contains the provider cluster labels. NodeLabels map[string]string `json:"nodeLabels,omitempty"` // NodeSelector contains the selector to be applied to offloaded pods. NodeSelector map[string]string `json:"nodeSelector,omitempty"` }
ResourceSliceStatus defines the observed state of ResourceSlice.
func (*ResourceSliceStatus) DeepCopy ¶
func (in *ResourceSliceStatus) DeepCopy() *ResourceSliceStatus
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceSliceStatus.
func (*ResourceSliceStatus) DeepCopyInto ¶
func (in *ResourceSliceStatus) DeepCopyInto(out *ResourceSliceStatus)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type Tenant ¶
type Tenant struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec TenantSpec `json:"spec,omitempty"` Status TenantStatus `json:"status,omitempty"` }
Tenant represents a consumer cluster.
func (*Tenant) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Tenant.
func (*Tenant) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*Tenant) DeepCopyObject ¶
DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
type TenantCondition ¶
type TenantCondition string
TenantCondition contains the conditions of the tenant.
const ( // TenantConditionActive indicates that the tenant is active: it can consume resources and negotiate new ones. TenantConditionActive TenantCondition = "Active" // TenantConditionCordoned indicates that the tenant is cordoned: the existing resources are preserved (and cordoned), // but no new ones can be negotiated. TenantConditionCordoned TenantCondition = "Cordoned" // TenantConditionDrained indicates that the tenant is drained: it can't consume resources nor negotiate new ones. TenantConditionDrained TenantCondition = "Drained" )
type TenantList ¶
type TenantList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty"` Items []Tenant `json:"items"` }
TenantList contains a list of Tenant.
func (*TenantList) DeepCopy ¶
func (in *TenantList) DeepCopy() *TenantList
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantList.
func (*TenantList) DeepCopyInto ¶
func (in *TenantList) DeepCopyInto(out *TenantList)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*TenantList) DeepCopyObject ¶
func (in *TenantList) DeepCopyObject() runtime.Object
DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
type TenantSpec ¶
type TenantSpec struct { // ClusterID is the id of the consumer cluster. // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="ClusterID is immutable" ClusterID liqov1beta1.ClusterID `json:"clusterID,omitempty"` // AuthzPolicy is the policy used by the cluster to authorize or reject an incoming ResourceSlice. // Default is KeysExchange. // +kubebuilder:validation:Enum=KeysExchange;TolerateNoHandshake // +kubebuilder:default=KeysExchange *AuthzPolicy `json:"authzPolicy,omitempty"` // PublicKey is the public key of the tenant cluster. PublicKey []byte `json:"publicKey,omitempty"` // CSR is the Certificate Signing Request of the tenant cluster. CSR []byte `json:"csr,omitempty"` // Signature contains the nonce signed by the tenant cluster. Signature []byte `json:"signature,omitempty"` // ProxyURL is the URL of the proxy used by the tenant cluster to connect to the local cluster (optional). ProxyURL *string `json:"proxyURL,omitempty"` // TenantCondition contains the conditions of the tenant. // +kubebuilder:validation:Enum=Active;Cordoned;Drained // +kubebuilder:default=Active TenantCondition TenantCondition `json:"tenantCondition,omitempty"` }
TenantSpec defines the desired state of Tenant.
func (*TenantSpec) DeepCopy ¶
func (in *TenantSpec) DeepCopy() *TenantSpec
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantSpec.
func (*TenantSpec) DeepCopyInto ¶
func (in *TenantSpec) DeepCopyInto(out *TenantSpec)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type TenantStatus ¶
type TenantStatus struct { // TenantNamespace is the namespace of the tenant cluster. TenantNamespace string `json:"tenantNamespace,omitempty"` // AuthParams contains the authentication parameters for the consumer cluster. AuthParams *AuthParams `json:"authParams,omitempty"` }
TenantStatus defines the observed state of Tenant.
func (*TenantStatus) DeepCopy ¶
func (in *TenantStatus) DeepCopy() *TenantStatus
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantStatus.
func (*TenantStatus) DeepCopyInto ¶
func (in *TenantStatus) DeepCopyInto(out *TenantStatus)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.