11 "bpa-restapi-agent/internal/db"
13 pkgerrors "github.com/pkg/errors"
16 // Image contains the parameters needed for Image information
18 Owner string `json:"owner"`
19 ClusterName string `json:"cluster_name"`
20 Type string `json:"type"`
21 ImageName string `json:"image_name"`
22 ImageOffset *int `json:"image_offset"`
23 ImageLength int `json:"image_length"`
24 UploadComplete *bool `json:"upload_complete"`
25 Description ImageRecordList `json:"description"`
28 type ImageRecordList struct {
29 ImageRecords []map[string]string `json:"image_records"`
32 // ImageKey is the key structure that is used in the database
33 type ImageKey struct {
34 ImageName string `json:"image_name"`
37 // We will use json marshalling to convert to string to
38 // preserve the underlying structure.
39 func (dk ImageKey) String() string {
40 out, err := json.Marshal(dk)
48 // ImageManager is an interface that exposes the Image functionality
49 type ImageManager interface {
50 Create(c Image) (Image, error)
51 Get(imageName string) (Image, error)
52 Delete(imageName string) error
53 Update(imageName string, c Image) (Image, error)
54 GetImageRecordByName(imgname, imageName string) (map[string]string, error)
55 GetDirPath(imageName string) (string, string, error)
58 // ImageClient implements the ImageManager
59 // It will also be used to maintain some localized state
60 type ImageClient struct {
65 // To Do - Fix repetition in
66 // NewImageClient returns an instance of the ImageClient
67 // which implements the ImageManager
68 func NewBinaryImageClient() *ImageClient {
70 storeName: "binary_images",
75 func NewContainerImageClient() *ImageClient {
77 storeName: "container_images",
82 func NewOSImageClient() *ImageClient {
84 storeName: "os_images",
89 // Create an entry for the Image resource in the database`
90 func (v *ImageClient) Create(c Image) (Image, error) {
92 //Construct composite key consisting of name
94 ImageName: c.ImageName,
97 //Check if this Image already exists
98 _, err := v.Get(c.ImageName)
100 return Image{}, pkgerrors.New("Image already exists")
103 err = db.DBconn.Create(v.storeName, key, v.tagMeta, c)
105 return Image{}, pkgerrors.Wrap(err, "Creating DB Entry")
109 err = v.CreateFile(v.storeName, c)
111 return Image{}, pkgerrors.Wrap(err, "Creating File in FS")
120 func (v *ImageClient) CreateFile(dirName string, c Image) error {
122 filePath, dirPath, err := v.GetDirPath(c.ImageName)
124 return pkgerrors.Wrap(err, "Get file path")
126 err = os.MkdirAll(dirPath, 0744)
128 return pkgerrors.Wrap(err, "Make image directory")
130 file1, err := os.Create(filePath)
132 return pkgerrors.Wrap(err, "Create image file")
141 // Get returns Image for corresponding to name
142 func (v *ImageClient) Get(imageName string) (Image, error) {
144 //Construct the composite key to select the entry
147 // ClusterName: clusterName,
148 ImageName: imageName,
151 value, err := db.DBconn.Read(v.storeName, key, v.tagMeta)
153 return Image{}, pkgerrors.Wrap(err, "Get Image")
156 //value is a byte array
159 err = db.DBconn.Unmarshal(value, &c)
161 return Image{}, pkgerrors.Wrap(err, "Unmarshaling Value")
166 return Image{}, pkgerrors.New("Error getting Connection")
169 func (v *ImageClient) GetImageRecordByName(imgName string,
170 imageRecordName string) (map[string]string, error) {
172 img, err := v.Get(imgName)
174 return nil, pkgerrors.Wrap(err, "Error getting image")
177 for _, value := range img.Description.ImageRecords {
178 if imageRecordName == value["image_record_name"] {
183 return nil, pkgerrors.New("Image record " + imageRecordName + " not found")
186 func (v *ImageClient) GetDirPath(imageName string) (string, string, error) {
187 u, err := user.Current()
189 return "", "", pkgerrors.Wrap(err, "Current user")
192 dirPath := path.Join(home, "images", v.storeName)
193 filePath := path.Join(dirPath, imageName)
195 return filePath, dirPath, err
198 // Delete the Image from database
199 func (v *ImageClient) Delete(imageName string) error {
201 //Construct the composite key to select the entry
203 ImageName: imageName,
205 err := db.DBconn.Delete(v.storeName, key, v.tagMeta)
207 return pkgerrors.Wrap(err, "Delete Image")
209 //Delete image from FS
210 filePath, _, err := v.GetDirPath(imageName)
212 return pkgerrors.Wrap(err, "Get file path")
214 err = os.Remove(filePath)
216 return pkgerrors.Wrap(err, "Delete image file")
222 // Update an entry for the image in the database
223 func (v *ImageClient) Update(imageName string, c Image) (Image, error) {
227 // ClusterName: c.ClusterName,
228 ImageName: imageName,
231 //Check if this Image exists
232 _, err := v.Get(imageName)
234 return Image{}, pkgerrors.New("Update Error - Image doesn't exist")
237 err = db.DBconn.Update(v.storeName, key, v.tagMeta, c)
239 return Image{}, pkgerrors.Wrap(err, "Updating DB Entry")