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
}