// GetBucketMetadata retrieves an bucket's metadata func (d donutDriver) GetBucketMetadata(bucketName string) (drivers.BucketMetadata, error) { if d.donut == nil { return drivers.BucketMetadata{}, iodine.New(drivers.InternalError{}, nil) } if !drivers.IsValidBucket(bucketName) || strings.Contains(bucketName, ".") { return drivers.BucketMetadata{}, drivers.BucketNameInvalid{Bucket: bucketName} } metadata, err := d.donut.GetBucketMetadata(bucketName) if err != nil { return drivers.BucketMetadata{}, iodine.New(drivers.BucketNotFound{Bucket: bucketName}, nil) } created, err := time.Parse(time.RFC3339Nano, metadata["created"]) if err != nil { return drivers.BucketMetadata{}, iodine.New(err, nil) } acl, ok := metadata["acl"] if !ok { return drivers.BucketMetadata{}, iodine.New(drivers.BackendCorrupted{}, nil) } bucketMetadata := drivers.BucketMetadata{ Name: bucketName, Created: created, ACL: drivers.BucketACL(acl), } return bucketMetadata, nil }
// GetBucketMetadata retrieves an bucket's metadata func (d donutDriver) GetBucketMetadata(bucketName string) (drivers.BucketMetadata, error) { d.lock.RLock() defer d.lock.RUnlock() if d.donut == nil { return drivers.BucketMetadata{}, iodine.New(drivers.InternalError{}, nil) } if !drivers.IsValidBucket(bucketName) || strings.Contains(bucketName, ".") { return drivers.BucketMetadata{}, drivers.BucketNameInvalid{Bucket: bucketName} } metadata, err := d.donut.GetBucketMetadata(bucketName) if err != nil { return drivers.BucketMetadata{}, iodine.New(drivers.BucketNotFound{Bucket: bucketName}, nil) } bucketMetadata := drivers.BucketMetadata{ Name: bucketName, Created: metadata.Created, ACL: drivers.BucketACL(metadata.ACL), } return bucketMetadata, nil }
// CreateBucket creates a new bucket func (d donutDriver) CreateBucket(bucketName, acl string) error { d.lock.Lock() defer d.lock.Unlock() if len(d.storedBuckets) == totalBuckets { return iodine.New(drivers.TooManyBuckets{Bucket: bucketName}, nil) } if d.donut == nil { return iodine.New(drivers.InternalError{}, nil) } if !drivers.IsValidBucketACL(acl) { return iodine.New(drivers.InvalidACL{ACL: acl}, nil) } if drivers.IsValidBucket(bucketName) { if strings.TrimSpace(acl) == "" { acl = "private" } if err := d.donut.MakeBucket(bucketName, acl); err != nil { switch iodine.ToError(err).(type) { case donut.BucketExists: return iodine.New(drivers.BucketExists{Bucket: bucketName}, nil) } return iodine.New(err, nil) } var newBucket = storedBucket{} newBucket.objectMetadata = make(map[string]drivers.ObjectMetadata) newBucket.multiPartSession = make(map[string]multiPartSession) newBucket.partMetadata = make(map[string]drivers.PartMetadata) metadata, err := d.donut.GetBucketMetadata(bucketName) if err != nil { return iodine.New(err, nil) } newBucket.bucketMetadata = drivers.BucketMetadata{ Name: metadata.Name, Created: metadata.Created, ACL: drivers.BucketACL(metadata.ACL), } d.storedBuckets[bucketName] = newBucket return nil } return iodine.New(drivers.BucketNameInvalid{Bucket: bucketName}, nil) }
// SetBucketMetadata - func (cache *cacheDriver) SetBucketMetadata(bucket, acl string) error { cache.lock.RLock() if !drivers.IsValidBucket(bucket) { cache.lock.RUnlock() return iodine.New(drivers.BucketNameInvalid{Bucket: bucket}, nil) } if _, ok := cache.storedBuckets[bucket]; ok == false { cache.lock.RUnlock() return iodine.New(drivers.BucketNotFound{Bucket: bucket}, nil) } if strings.TrimSpace(acl) == "" { acl = "private" } cache.lock.RUnlock() cache.lock.Lock() defer cache.lock.Unlock() storedBucket := cache.storedBuckets[bucket] storedBucket.bucketMetadata.ACL = drivers.BucketACL(acl) cache.storedBuckets[bucket] = storedBucket return nil }
// SetBucketMetadata sets bucket's metadata func (d donutDriver) SetBucketMetadata(bucketName, acl string) error { d.lock.Lock() defer d.lock.Unlock() if d.donut == nil { return iodine.New(drivers.InternalError{}, nil) } if !drivers.IsValidBucket(bucketName) { return iodine.New(drivers.BucketNameInvalid{Bucket: bucketName}, nil) } if strings.TrimSpace(acl) == "" { acl = "private" } bucketMetadata := make(map[string]string) bucketMetadata["acl"] = acl err := d.donut.SetBucketMetadata(bucketName, bucketMetadata) if err != nil { return iodine.New(drivers.BucketNotFound{Bucket: bucketName}, nil) } storedBucket := d.storedBuckets[bucketName] storedBucket.bucketMetadata.ACL = drivers.BucketACL(acl) d.storedBuckets[bucketName] = storedBucket return nil }
func initialize(d *donutDriver) error { // Soon to be user configurable, when Management API is available // we should remove "default" to something which is passed down // from configuration paramters var err error d.donut, err = donut.NewDonut("default", createNodeDiskMap(d.paths)) if err != nil { return iodine.New(err, nil) } buckets, err := d.donut.ListBuckets() if err != nil { return iodine.New(err, nil) } for bucketName, metadata := range buckets { d.lock.RLock() storedBucket := d.storedBuckets[bucketName] d.lock.RUnlock() if len(storedBucket.multiPartSession) == 0 { storedBucket.multiPartSession = make(map[string]multiPartSession) } if len(storedBucket.objectMetadata) == 0 { storedBucket.objectMetadata = make(map[string]drivers.ObjectMetadata) } if len(storedBucket.partMetadata) == 0 { storedBucket.partMetadata = make(map[string]drivers.PartMetadata) } storedBucket.bucketMetadata = drivers.BucketMetadata{ Name: metadata.Name, Created: metadata.Created, ACL: drivers.BucketACL(metadata.ACL), } d.lock.Lock() d.storedBuckets[bucketName] = storedBucket d.lock.Unlock() } return nil }
// CreateBucket - create bucket in cache func (cache *cacheDriver) CreateBucket(bucketName, acl string) error { cache.lock.RLock() if len(cache.storedBuckets) == totalBuckets { cache.lock.RUnlock() return iodine.New(drivers.TooManyBuckets{Bucket: bucketName}, nil) } if !drivers.IsValidBucket(bucketName) { cache.lock.RUnlock() return iodine.New(drivers.BucketNameInvalid{Bucket: bucketName}, nil) } if !drivers.IsValidBucketACL(acl) { cache.lock.RUnlock() return iodine.New(drivers.InvalidACL{ACL: acl}, nil) } if _, ok := cache.storedBuckets[bucketName]; ok == true { cache.lock.RUnlock() return iodine.New(drivers.BucketExists{Bucket: bucketName}, nil) } cache.lock.RUnlock() if strings.TrimSpace(acl) == "" { // default is private acl = "private" } var newBucket = storedBucket{} newBucket.objectMetadata = make(map[string]drivers.ObjectMetadata) newBucket.multiPartSession = make(map[string]multiPartSession) newBucket.partMetadata = make(map[string]drivers.PartMetadata) newBucket.bucketMetadata = drivers.BucketMetadata{} newBucket.bucketMetadata.Name = bucketName newBucket.bucketMetadata.Created = time.Now().UTC() newBucket.bucketMetadata.ACL = drivers.BucketACL(acl) cache.lock.Lock() cache.storedBuckets[bucketName] = newBucket cache.lock.Unlock() return nil }
// GetBucketMetadata - func (fs *fsDriver) GetBucketMetadata(bucket string) (drivers.BucketMetadata, error) { fs.lock.Lock() defer fs.lock.Unlock() if !drivers.IsValidBucket(bucket) { return drivers.BucketMetadata{}, iodine.New(drivers.BucketNameInvalid{Bucket: bucket}, nil) } // get bucket path bucketDir := filepath.Join(fs.root, bucket) bucketMetadata := drivers.BucketMetadata{} fi, err := os.Stat(bucketDir) // check if bucket exists if os.IsNotExist(err) { return drivers.BucketMetadata{}, iodine.New(drivers.BucketNotFound{Bucket: bucket}, nil) } if err != nil { return drivers.BucketMetadata{}, iodine.New(err, nil) } bucketMetadata.Name = fi.Name() bucketMetadata.Created = fi.ModTime() // TODO convert os.FileMode to meaningful ACL's bucketMetadata.ACL = drivers.BucketACL("private") return bucketMetadata, nil }