8 "bpa-restapi-agent/internal/db"
10 pkgerrors "github.com/pkg/errors"
13 // Image contains the parameters needed for Image information
15 Owner string `json:"owner"`
16 ClusterName string `json:"cluster_name"`
17 Type string `json:"type"`
18 ImageName string `json:"image_name"`
19 ImageOffset *int `json:"image_offset"`
20 ImageLength int `json:"image_length"`
21 UploadComplete *bool `json:"upload_complete"`
22 Description ImageRecordList `json:"description"`
25 type ImageRecordList struct {
26 ImageRecords []map[string]string `json:"image_records"`
29 // ImageKey is the key structure that is used in the database
30 type ImageKey struct {
31 // Owner string `json:"owner"`
32 // ClusterName string `json:"cluster_name"`
33 ImageName string `json:"image_name"`
36 // We will use json marshalling to convert to string to
37 // preserve the underlying structure.
38 func (dk ImageKey) String() string {
39 out, err := json.Marshal(dk)
47 // ImageManager is an interface that exposes the Image functionality
48 type ImageManager interface {
49 Create(c Image) (Image, error)
50 Get(imageName string) (Image, error)
51 Delete(imageName string) error
52 Update(imageName string, c Image) (Image, error)
53 GetImageRecordByName(imgname, imageName string) (map[string]string, error)
54 GetDirPath(imageName string) (string, string, error)
57 // ImageClient implements the ImageManager
58 // It will also be used to maintain some localized state
59 type ImageClient struct {
64 // To Do - Fix repetition in
65 // NewImageClient returns an instance of the ImageClient
66 // which implements the ImageManager
67 func NewBinaryImageClient() *ImageClient {
69 storeName: "binary_images",
74 func NewContainerImageClient() *ImageClient {
76 storeName: "container_images",
81 func NewOSImageClient() *ImageClient {
83 storeName: "os_images",
88 // Create an entry for the Image resource in the database`
89 func (v *ImageClient) Create(c Image) (Image, error) {
91 //Construct composite key consisting of name
94 // ClusterName: c.ClusterName,
95 ImageName: c.ImageName,
98 //Check if this Image already exists
99 _, err := v.Get(c.ImageName)
101 return Image{}, pkgerrors.New("Image already exists")
104 err = db.DBconn.Create(v.storeName, key, v.tagMeta, c)
106 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")
119 func (v *ImageClient) CreateFile(dirName string, c Image) error {
120 filePath, dirPath, err := v.GetDirPath(c.ImageName)
122 return pkgerrors.Wrap(err, "Get file path")
124 err = os.MkdirAll(dirPath, 0744)
126 return pkgerrors.Wrap(err, "Make image directory")
128 file1, err := os.Create(filePath)
130 return pkgerrors.Wrap(err, "Create image file")
140 // Get returns Image for corresponding to name
141 func (v *ImageClient) Get(imageName string) (Image, error) {
143 //Construct the composite key to select the entry
146 // ClusterName: clusterName,
147 ImageName: imageName,
150 value, err := db.DBconn.Read(v.storeName, key, v.tagMeta)
152 return Image{}, pkgerrors.Wrap(err, "Get Image")
155 //value is a byte array
158 err = db.DBconn.Unmarshal(value, &c)
160 return Image{}, pkgerrors.Wrap(err, "Unmarshaling Value")
165 return Image{}, pkgerrors.New("Error getting Connection")
168 func (v *ImageClient) GetImageRecordByName(imgName string,
169 imageRecordName string) (map[string]string, error) {
171 img, err := v.Get(imgName)
173 return nil, pkgerrors.Wrap(err, "Error getting image")
176 for _, value := range img.Description.ImageRecords {
177 if imageRecordName == value["image_record_name"] {
182 return nil, pkgerrors.New("Image record " + imageRecordName + " not found")
185 func (v *ImageClient) GetDirPath(imageName string) (string, string, error) {
186 u, err := user.Current()
188 return "", "", pkgerrors.Wrap(err, "Current user")
191 dirPath := path.Join(home, "images", v.storeName)
192 filePath := path.Join(dirPath, imageName)
194 return filePath, dirPath, err
197 // Delete the Image from database
198 func (v *ImageClient) Delete(imageName string) error {
200 //Construct the composite key to select the entry
203 // ClusterName: clusterName,
204 ImageName: imageName,
206 err := db.DBconn.Delete(v.storeName, key, v.tagMeta)
208 return pkgerrors.Wrap(err, "Delete Image")
211 //Delete image from FS
212 filePath, _, err := v.GetDirPath(imageName)
214 return pkgerrors.Wrap(err, "Get file path")
216 err = os.Remove(filePath)
218 return pkgerrors.Wrap(err, "Delete image file")
223 // Update an entry for the image in the database
224 func (v *ImageClient) Update(imageName string, c Image) (Image, error) {
227 ImageName: imageName,
230 //Check if this Image exists
231 _, err := v.Get(imageName)
233 return Image{}, pkgerrors.New("Update Error - Image doesn't exist")
236 err = db.DBconn.Update(v.storeName, key, v.tagMeta, c)
238 return Image{}, pkgerrors.Wrap(err, "Updating DB Entry")