func()

in step_copy_gcs_objects.go [46:123]


func (c *CopyGCSObjects) validate(ctx context.Context, s *Step) DError {
	for _, co := range *c {
		sBkt, _, err := splitGCSPath(co.Source)
		if err != nil {
			return err
		}
		dBkt, dObj, err := splitGCSPath(co.Destination)
		if err != nil {
			return err
		}

		// Add object to object list.
		if err := s.w.objects.regCreate(path.Join(dBkt, dObj)); err != nil {
			return err
		}

		// Check if source bucket exists and is readable.
		readableBkts.mx.Lock()
		if !strIn(sBkt, readableBkts.bkts) {
			if _, err := s.w.StorageClient.Bucket(sBkt).Attrs(ctx); err != nil {
				return Errf("error reading bucket %q: %v", sBkt, err)
			}
			readableBkts.bkts = append(readableBkts.bkts, sBkt)
		}
		readableBkts.mx.Unlock()

		// Check if destination bucket exists and is readable.
		writableBkts.mx.Lock()
		if !strIn(dBkt, writableBkts.bkts) {
			if _, err := s.w.StorageClient.Bucket(dBkt).Attrs(ctx); err != nil {
				return Errf("error reading bucket %q: %v", dBkt, err)
			}

			// Check if destination bucket is writable.
			tObj := s.w.StorageClient.Bucket(dBkt).Object(fmt.Sprintf("daisy-validate-%s-%s", s.name, s.w.id))
			w := tObj.NewWriter(ctx)
			if _, err := w.Write(nil); err != nil {
				return newErr("failed to ", err)
			}
			if err := w.Close(); err != nil {
				return Errf("error writing to bucket %q: %v", dBkt, err)
			}
			if err := tObj.Delete(ctx); err != nil {
				return Errf("error deleting file %+v after write validation: %v", tObj, err)
			}
			writableBkts.bkts = append(writableBkts.bkts, dBkt)
		}
		writableBkts.mx.Unlock()

		// Check each ACLRule
		for _, acl := range co.ACLRules {
			if acl.Entity == "" {
				return Errf("ACLRule.Entity must not be empty: %+v", acl)
			}
			roles := []string{string(storage.RoleOwner), string(storage.RoleReader), string(storage.RoleWriter)}
			if !strIn(string(acl.Role), roles) {
				return Errf("ACLRule.Role invalid: %q not one of %q", acl.Role, roles)
			}

			// Test ACLRule.Entity.
			tObj := s.w.StorageClient.Bucket(dBkt).Object(fmt.Sprintf("daisy-validate-%s-%s", s.name, s.w.id))
			w := tObj.NewWriter(ctx)
			if _, err := w.Write(nil); err != nil {
				return newErr("failed to write to GCS object when testing ACLRule.Entity", err)
			}
			if err := w.Close(); err != nil {
				return newErr("failed to close GCS object when testing ACLRule.Entity", err)
			}
			defer tObj.Delete(ctx)

			if err := tObj.ACL().Set(ctx, acl.Entity, acl.Role); err != nil {
				return Errf("error validating ACLRule %+v: %v", acl, err)
			}
		}
	}

	return nil
}