From f64c8c3ebba380877cf180c73069a80f480c0ea3 Mon Sep 17 00:00:00 2001 From: Crossplane Date: Mon, 28 Oct 2019 17:25:38 +0000 Subject: [PATCH] docs snapshot for crossplane version `master` --- .../cloud-providers/aws/aws-provider.md | 2 +- docs/master/quick-start.md | 2 +- docs/master/services-developer-guide.md | 74 +++++++++---------- docs/master/stacks-guide-aws.md | 28 +++---- docs/master/stacks-guide-azure.md | 14 ++-- docs/master/stacks-guide-gcp.md | 12 +-- docs/master/stacks-guide-rook.md | 4 +- 7 files changed, 68 insertions(+), 68 deletions(-) diff --git a/docs/master/cloud-providers/aws/aws-provider.md b/docs/master/cloud-providers/aws/aws-provider.md index 4f023b50..c40d6f26 100644 --- a/docs/master/cloud-providers/aws/aws-provider.md +++ b/docs/master/cloud-providers/aws/aws-provider.md @@ -34,7 +34,7 @@ You can confirm the existense of the [`aw provider`] by running: kubectl -n crossplane-system get provider/aws-provider ``` -[`aw provider`]: https://github.com/crossplaneio/stack-aws/blob/master/aws/apis/v1alpha2/types.go#L43 +[`aw provider`]: https://github.com/crossplaneio/stack-aws/blob/master/aws/apis/v1alpha3/types.go#L43 [`aws` command line tool]: https://aws.amazon.com/cli/ [AWS SDK for GO]: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/setting-up.html [installed]: [https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) diff --git a/docs/master/quick-start.md b/docs/master/quick-start.md index f8f626ad..9bcdeeec 100644 --- a/docs/master/quick-start.md +++ b/docs/master/quick-start.md @@ -63,7 +63,7 @@ connect to your GCP project. We'll do this by creating a Crossplane `Provider` that specifies the project name and some GCP service account credentials to use: ```yaml -apiVersion: gcp.crossplane.io/v1alpha2 +apiVersion: gcp.crossplane.io/v1alpha3 kind: Provider metadata: name: example-provider diff --git a/docs/master/services-developer-guide.md b/docs/master/services-developer-guide.md index 1cc53541..b266d7aa 100644 --- a/docs/master/services-developer-guide.md +++ b/docs/master/services-developer-guide.md @@ -496,8 +496,8 @@ import ( "github.com/crossplaneio/crossplane-runtime/pkg/meta" "github.com/crossplaneio/crossplane-runtime/pkg/resource" - "github.com/crossplaneio/stack-fcp/apis/database/v1alpha2" - fcpv1alpha2 "github.com/crossplaneio/stack-fcp/apis/v1alpha2" + "github.com/crossplaneio/stack-fcp/apis/database/v1alpha3" + fcpv1alpha3 "github.com/crossplaneio/stack-fcp/apis/v1alpha3" ) type FavouriteDBInstanceController struct{} @@ -507,10 +507,10 @@ type FavouriteDBInstanceController struct{} // connecter, which satisfies the ExternalConnecter interface. func (c *FavouriteDBInstanceController) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). - Named(strings.ToLower(fmt.Sprintf("%s.%s", v1alpha2.FavouriteDBInstanceKind, v1alpha2.Group))). - For(&v1alpha2.FavouriteDBInstance{}). + Named(strings.ToLower(fmt.Sprintf("%s.%s", v1alpha3.FavouriteDBInstanceKind, v1alpha3.Group))). + For(&v1alpha3.FavouriteDBInstance{}). Complete(resource.NewManagedReconciler(mgr, - resource.ManagedKind(v1alpha2.FavouriteDBInstanceGroupVersionKind), + resource.ManagedKind(v1alpha3.FavouriteDBInstanceGroupVersionKind), resource.WithExternalConnecter(&connecter{client: mgr.GetClient()}))) } @@ -525,13 +525,13 @@ func (c *connecter) Connect(ctx context.Context, mg resource.Managed) (resource. // FavouriteDBInstance. We told NewControllerManagedBy that this was a // controller For FavouriteDBInstance, so something would have to go // horribly wrong for us to encounter another type. - i, ok := mg.(*v1alpha2.FavouriteDBInstance) + i, ok := mg.(*v1alpha3.FavouriteDBInstance) if !ok { return nil, errors.New("managed resource is not a FavouriteDBInstance") } // Get the Provider referenced by the FavouriteDBInstance. - p := &fcpv1alpha2.Provider{} + p := &fcpv1alpha3.Provider{} if err := c.client.Get(ctx, meta.NamespacedNameOf(i.Spec.ProviderReference), p); err != nil { return nil, errors.Wrap(err, "cannot get Provider") } @@ -556,7 +556,7 @@ type external struct{ client database.Client } // calls Observe in order to determine whether an external resource needs to be // created, updated, or deleted. func (e *external) Observe(ctx context.Context, mg resource.Managed) (resource.ExternalObservation, error) { - i, ok := mg.(*v1alpha2.FavouriteDBInstance) + i, ok := mg.(*v1alpha3.FavouriteDBInstance) if !ok { return resource.ExternalObservation{}, errors.New("managed resource is not a FavouriteDBInstance") } @@ -623,7 +623,7 @@ func (e *external) Observe(ctx context.Context, mg resource.Managed) (resource.E // resource. resource.ManagedReconciler only calls Create if Observe reported // that the external resource did not exist. func (e *external) Create(ctx context.Context, mg resource.Managed) (resource.ExternalCreation, error) { - i, ok := mg.(*v1alpha2.FavouriteDBInstance) + i, ok := mg.(*v1alpha3.FavouriteDBInstance) if !ok { return resource.ExternalCreation{}, errors.New("managed resource is not a FavouriteDBInstance") } @@ -655,7 +655,7 @@ func (e *external) Create(ctx context.Context, mg resource.Managed) (resource.Ex // managed resource. resource.ManagedReconciler only calls Update if Observe // reported that the external resource was not up to date. func (e *external) Update(ctx context.Context, mg resource.Managed) (resource.ExternalUpdate, error) { - i, ok := mg.(*v1alpha2.FavouriteDBInstance) + i, ok := mg.(*v1alpha3.FavouriteDBInstance) if !ok { return resource.ExternalUpdate{}, errors.New("managed resource is not a FavouriteDBInstance") } @@ -669,7 +669,7 @@ func (e *external) Update(ctx context.Context, mg resource.Managed) (resource.Ex // Delete the external resource. resource.ManagedReconciler only calls Delete // when a managed resource with the 'Delete' reclaim policy has been deleted. func (e *external) Delete(ctx context.Context, mg resource.Managed) error { - i, ok := mg.(*v1alpha2.FavouriteDBInstance) + i, ok := mg.(*v1alpha3.FavouriteDBInstance) if !ok { return errors.New("managed resource is not a FavouriteDBInstance") } @@ -711,7 +711,7 @@ import ( // infrastructure stacks. databasev1alpha1 "github.com/crossplaneio/crossplane/apis/database/v1alpha1" - "github.com/crossplaneio/stack-fcp/apis/database/v1alpha2" + "github.com/crossplaneio/stack-fcp/apis/database/v1alpha3" ) type PostgreSQLInstanceClaimSchedulingController struct{} @@ -725,8 +725,8 @@ func (c *FancySQLInstanceClaimSchedulingController) SetupWithManager(mgr ctrl.Ma // case "fancysqlinstance.favouritedbinstance.fcp.crossplane.io". name := strings.ToLower(fmt.Sprintf("scheduler.%s.%s.%s", databasev1alpha1.FancySQLInstanceKind, - v1alpha2.FavouriteDBInstanceKind, - v1alpha2.Group)) + v1alpha3.FavouriteDBInstanceKind, + v1alpha3.Group)) return ctrl.NewControllerManagedBy(mgr). Named(name). @@ -748,7 +748,7 @@ func (c *FancySQLInstanceClaimSchedulingController) SetupWithManager(mgr ctrl.Ma ))). Complete(resource.NewClaimSchedulingReconciler(mgr, resource.ClaimKind(databasev1alpha1.FancySQLInstanceGroupVersionKind), - resource.ClassKind(v1alpha2.FavouriteDBInstanceClassGroupVersionKind), + resource.ClassKind(v1alpha3.FavouriteDBInstanceClassGroupVersionKind), )) } ``` @@ -779,7 +779,7 @@ import ( // infrastructure stacks. databasev1alpha1 "github.com/crossplaneio/crossplane/apis/database/v1alpha1" - "github.com/crossplaneio/stack-fcp/apis/database/v1alpha2" + "github.com/crossplaneio/stack-fcp/apis/database/v1alpha3" ) type PostgreSQLInstanceClaimDefaultingController struct{} @@ -793,8 +793,8 @@ func (c *FancySQLInstanceClaimDefaultingController) SetupWithManager(mgr ctrl.Ma // case "fancysqlinstance.favouritedbinstance.fcp.crossplane.io". name := strings.ToLower(fmt.Sprintf("scheduler.%s.%s.%s", databasev1alpha1.FancySQLInstanceKind, - v1alpha2.FavouriteDBInstanceKind, - v1alpha2.Group)) + v1alpha3.FavouriteDBInstanceKind, + v1alpha3.Group)) return ctrl.NewControllerManagedBy(mgr). Named(name). @@ -815,7 +815,7 @@ func (c *FancySQLInstanceClaimDefaultingController) SetupWithManager(mgr ctrl.Ma ))). Complete(resource.NewClaimDefaultingReconciler(mgr, resource.ClaimKind(databasev1alpha1.FancySQLInstanceGroupVersionKind), - resource.ClassKind(v1alpha2.FavouriteDBInstanceClassGroupVersionKind), + resource.ClassKind(v1alpha3.FavouriteDBInstanceClassGroupVersionKind), )) } ``` @@ -851,7 +851,7 @@ import ( // infrastructure stacks. databasev1alpha1 "github.com/crossplaneio/crossplane/apis/database/v1alpha1" - "github.com/crossplaneio/stack-fcp/apis/database/v1alpha2" + "github.com/crossplaneio/stack-fcp/apis/database/v1alpha3" ) type FavouriteDBInstanceClaimController struct{} @@ -864,8 +864,8 @@ func (c *FavouriteDBInstanceClaimController) SetupWithManager(mgr ctrl.Manager) // "fancysqlinstance.favouritedbinstance.fcp.crossplane.io". name := strings.ToLower(fmt.Sprintf("%s.%s.%s", databasev1alpha1.FancySQLInstanceKind, - v1alpha2.FavouriteDBInstanceKind, - v1alpha2.Group)) + v1alpha3.FavouriteDBInstanceKind, + v1alpha3.Group)) // The controller below watches for changes to both FancySQLInstance and // FavouriteDBInstance kind resources. We use watch predicates to filter @@ -873,25 +873,25 @@ func (c *FavouriteDBInstanceClaimController) SetupWithManager(mgr ctrl.Manager) p := resource.NewPredicates(resource.AnyOf( // We want to reconcile FancySQLInstance kind resource claims that // reference a FavouriteDBInstanceClass. - resource.HasClassReferenceKind(resource.ClassKind(v1alpha2.FavouriteDBInstanceClassGroupVersionKind), + resource.HasClassReferenceKind(resource.ClassKind(v1alpha3.FavouriteDBInstanceClassGroupVersionKind), // We want to reconcile FancySQLInstance kind resource claims that // explicitly set their .spec.resourceRef to a FavouriteDBInstance kind // managed resource. - resource.HasManagedResourceReferenceKind(resource.ManagedKind(v1alpha2.FavouriteDBInstanceGroupVersionKind)), + resource.HasManagedResourceReferenceKind(resource.ManagedKind(v1alpha3.FavouriteDBInstanceGroupVersionKind)), // We want to reconcile FavouriteDBInstance managed resources. Resources // without a claim reference will be filtered by the below // EnqueueRequestForClaim watch event handler. - resource.IsManagedKind(resource.ManagedKind(v1alpha2.FavouriteDBInstanceClassGroupVersionKind), mgr.GetScheme()), + resource.IsManagedKind(resource.ManagedKind(v1alpha3.FavouriteDBInstanceClassGroupVersionKind), mgr.GetScheme()), )) // Create a new resource claim reconciler... r := resource.NewClaimReconciler(mgr, // ..that uses the supplied claim, class, and managed resource kinds. resource.ClaimKind(databasev1alpha1.FancySQLInstanceGroupVersionKind), - resource.ClassKind(v1alpha2.FavouriteDBInstanceClassGroupVersionKind), - resource.ManagedKind(v1alpha2.FavouriteDBInstanceGroupVersionKind), + resource.ClassKind(v1alpha3.FavouriteDBInstanceClassGroupVersionKind), + resource.ManagedKind(v1alpha3.FavouriteDBInstanceGroupVersionKind), // The resource claim reconciler assumes managed resources do not // use the status subresource for compatibility with older managed // resource kinds, so well behaved resources must explicitly tell the @@ -911,7 +911,7 @@ func (c *FavouriteDBInstanceClaimController) SetupWithManager(mgr ctrl.Manager) // claim it references and reconcile that claim. return ctrl.NewControllerManagedBy(mgr). Named(name). - Watches(&source.Kind{Type: &v1alpha2.FavouriteDBInstance{}}, &resource.EnqueueRequestForClaim{}). + Watches(&source.Kind{Type: &v1alpha3.FavouriteDBInstance{}}, &resource.EnqueueRequestForClaim{}). For(&databasev1alpha1.FancySQLInstance{}). WithEventFilter(p). Complete(r) @@ -924,17 +924,17 @@ func ConfigureFavouriteDBInstance(_ context.Context, cm resource.Claim, cs resou return errors.New("resource claim is not a FancySQLInstance") } - class, ok := cs.(*v1alpha2.FavouriteDBInstanceClass) + class, ok := cs.(*v1alpha3.FavouriteDBInstanceClass) if !ok { return errors.New("resource class is not a FavouriteDBInstanceClass") } - instance, ok := mg.(*v1alpha2.FavouriteDBInstance) + instance, ok := mg.(*v1alpha3.FavouriteDBInstance) if !ok { return errors.New("managed resource is not a FavouriteDBInstance") } - instance.Spec = v1alpha2.FavouriteDBInstanceSpec{ + instance.Spec = v1alpha3.FavouriteDBInstanceSpec{ ResourceSpec: runtimev1alpha1.ResourceSpec{ // It's typical for dynamically provisioned managed resources to // store their connection details in a Secret named for the claim's @@ -980,7 +980,7 @@ import ( "github.com/crossplaneio/crossplane-runtime/pkg/resource" databasev1alpha1 "github.com/crossplaneio/crossplane/apis/database/v1alpha1" - "github.com/crossplaneio/stack-fcp/apis/database/v1alpha2" + "github.com/crossplaneio/stack-fcp/apis/database/v1alpha3" ) type FavouriteDBInstanceSecretController struct{} @@ -988,11 +988,11 @@ type FavouriteDBInstanceSecretController struct{} func (c *FavouriteDBInstanceSecretController) SetupWithManager(mgr ctrl.Manager) error { p := resource.NewPredicates(resource.AnyOf( resource.AllOf(resource.IsControlledByKind(databasev1alpha1.FancySQLInstanceGroupVersionKind), resource.IsPropagated()), - resource.AllOf(resource.IsControlledByKind(v1alpha2.FavouriteDBInstanceGroupVersionKind), resource.IsPropagator()), + resource.AllOf(resource.IsControlledByKind(v1alpha3.FavouriteDBInstanceGroupVersionKind), resource.IsPropagator()), )) return ctrl.NewControllerManagedBy(mgr). - Named(strings.ToLower(fmt.Sprintf("connectionsecret.%s.%s", v1alpha2.FavouriteDBInstanceKind, v1alpha2.Group))). + Named(strings.ToLower(fmt.Sprintf("connectionsecret.%s.%s", v1alpha3.FavouriteDBInstanceKind, v1alpha3.Group))). Watches(&source.Kind{Type: &corev1.Secret{}}, &resource.EnqueueRequestForPropagator{}). For(&corev1.Secret{}). WithEventFilter(p). @@ -1068,9 +1068,9 @@ value any feedback you may have about the services development process! [resource claim]: concepts.md#resource-claim [resource class]: concepts.md#resource-class [dynamic provisioning]: concepts.md#dynamic-and-static-provisioning -[`CloudMemorystoreInstance`]: https://github.com/crossplaneio/stack-gcp/blob/42ebb8b71/gcp/apis/cache/v1alpha2/cloudmemorystore_instance_types.go#L146 -[`CloudMemorystoreInstanceClass`]: https://github.com/crossplaneio/stack-gcp/blob/42ebb8b71/gcp/apis/cache/v1alpha2/cloudmemorystore_instance_types.go#L237 -[`Provider`]: https://github.com/crossplaneio/stack-gcp/blob/24ab7381b/gcp/apis/v1alpha2/types.go#L37 +[`CloudMemorystoreInstance`]: https://github.com/crossplaneio/stack-gcp/blob/42ebb8b71/gcp/apis/cache/v1beta1/cloudmemorystore_instance_types.go#L146 +[`CloudMemorystoreInstanceClass`]: https://github.com/crossplaneio/stack-gcp/blob/42ebb8b71/gcp/apis/cache/v1beta1/cloudmemorystore_instance_types.go#L237 +[`Provider`]: https://github.com/crossplaneio/stack-gcp/blob/24ab7381b/gcp/apis/v1alpha3/types.go#L37 [`RedisCluster`]: https://github.com/crossplaneio/crossplane/blob/3c6cf4e/apis/cache/v1alpha1/rediscluster_types.go#L40 [`RedisClusterClass`]: https://github.com/crossplaneio/crossplane/blob/3c6cf4e/apis/cache/v1alpha1/rediscluster_types.go#L116 [watching the API server]: https://kubernetes.io/docs/reference/using-api/api-concepts/#efficient-detection-of-changes diff --git a/docs/master/stacks-guide-aws.md b/docs/master/stacks-guide-aws.md index ad47f238..71412318 100644 --- a/docs/master/stacks-guide-aws.md +++ b/docs/master/stacks-guide-aws.md @@ -149,7 +149,7 @@ type: Opaque data: credentials: ${BASE64ENCODED_AWS_ACCOUNT_CREDS} --- -apiVersion: aws.crossplane.io/v1alpha2 +apiVersion: aws.crossplane.io/v1alpha3 kind: Provider metadata: name: aws-provider @@ -236,7 +236,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: network.aws.crossplane.io/v1alpha2 + apiVersion: network.aws.crossplane.io/v1alpha3 kind: VPC metadata: name: sample-vpc @@ -254,7 +254,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: network.aws.crossplane.io/v1alpha2 + apiVersion: network.aws.crossplane.io/v1alpha3 kind: Subnet metadata: name: sample-subnet1 @@ -267,7 +267,7 @@ Below we inspect each of these resources in more details. providerRef: name: aws-provider --- - apiVersion: network.aws.crossplane.io/v1alpha2 + apiVersion: network.aws.crossplane.io/v1alpha3 kind: Subnet metadata: name: sample-subnet2 @@ -280,7 +280,7 @@ Below we inspect each of these resources in more details. providerRef: name: aws-provider --- - apiVersion: network.aws.crossplane.io/v1alpha2 + apiVersion: network.aws.crossplane.io/v1alpha3 kind: Subnet metadata: name: sample-subnet3 @@ -301,7 +301,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: network.aws.crossplane.io/v1alpha2 + apiVersion: network.aws.crossplane.io/v1alpha3 kind: InternetGateway metadata: name: sample-internetgateway @@ -319,7 +319,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: network.aws.crossplane.io/v1alpha2 + apiVersion: network.aws.crossplane.io/v1alpha3 kind: RouteTable metadata: name: sample-routetable @@ -352,7 +352,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: network.aws.crossplane.io/v1alpha2 + apiVersion: network.aws.crossplane.io/v1alpha3 kind: SecurityGroup metadata: name: sample-cluster-sg @@ -371,7 +371,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: network.aws.crossplane.io/v1alpha2 + apiVersion: network.aws.crossplane.io/v1alpha3 kind: SecurityGroup metadata: name: sample-rds-sg @@ -424,7 +424,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: identity.aws.crossplane.io/v1alpha2 + apiVersion: identity.aws.crossplane.io/v1alpha3 kind: IAMRole metadata: name: sample-eks-cluster-role @@ -456,7 +456,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: identity.aws.crossplane.io/v1alpha2 + apiVersion: identity.aws.crossplane.io/v1alpha3 kind: IAMRolePolicyAttachment metadata: name: sample-role-servicepolicy @@ -469,7 +469,7 @@ Below we inspect each of these resources in more details. providerRef: name: aws-provider --- - apiVersion: identity.aws.crossplane.io/v1alpha2 + apiVersion: identity.aws.crossplane.io/v1alpha3 kind: IAMRolePolicyAttachment metadata: name: sample-role-clusterpolicy @@ -573,7 +573,7 @@ Below we inspect each of these resource classes in more details: ```yaml --- - apiVersion: compute.aws.crossplane.io/v1alpha2 + apiVersion: compute.aws.crossplane.io/v1alpha3 kind: EKSClusterClass metadata: name: standard-cluster @@ -634,7 +634,7 @@ off. [aws user]: https://docs.aws.amazon.com/mediapackage/latest/ug/setting-up-create-iam-user.html [Access Key]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html [AWS security credentials]: https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html -[aws provider]: https://github.com/crossplaneio/stack-aws/blob/master/apis/v1alpha2/types.go#L43?ref=master +[aws provider]: https://github.com/crossplaneio/stack-aws/blob/master/apis/v1alpha3/types.go#L43?ref=master [aws command line tool]: https://aws.amazon.com/cli/ [install-aws]: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html [aws-cli-configure]: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html diff --git a/docs/master/stacks-guide-azure.md b/docs/master/stacks-guide-azure.md index e7a6d42a..d2946cf9 100644 --- a/docs/master/stacks-guide-azure.md +++ b/docs/master/stacks-guide-azure.md @@ -140,7 +140,7 @@ type: Opaque data: credentials: ${BASE64ENCODED_AZURE_ACCOUNT_CREDS} --- -apiVersion: azure.crossplane.io/v1alpha2 +apiVersion: azure.crossplane.io/v1alpha3 kind: Provider metadata: name: azure-provider @@ -230,7 +230,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: azure.crossplane.io/v1alpha2 + apiVersion: azure.crossplane.io/v1alpha3 kind: ResourceGroup metadata: name: sample-rg @@ -247,7 +247,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: network.azure.crossplane.io/v1alpha2 + apiVersion: network.azure.crossplane.io/v1alpha3 kind: VirtualNetwork metadata: name: sample-vnet @@ -269,7 +269,7 @@ Below we inspect each of these resources in more details. ```yaml --- - apiVersion: network.azure.crossplane.io/v1alpha2 + apiVersion: network.azure.crossplane.io/v1alpha3 kind: Subnet metadata: name: sample-subnet @@ -352,7 +352,7 @@ Below we inspect each of these resource classes in more details: ```yaml --- - apiVersion: database.azure.crossplane.io/v1alpha2 + apiVersion: database.azure.crossplane.io/v1alpha3 kind: SQLServerClass metadata: name: standard-mysql @@ -384,7 +384,7 @@ Below we inspect each of these resource classes in more details: ```yaml --- - apiVersion: compute.azure.crossplane.io/v1alpha2 + apiVersion: compute.azure.crossplane.io/v1alpha3 kind: AKSClusterClass metadata: name: standard-cluster @@ -427,7 +427,7 @@ exists, and will create the rule if so. ```bash cat > vnet-rule.yaml < gkeclass.yaml <