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 Config string `json:"config"`
20 ImageOffset *int `json:"image_offset"`
21 ImageLength int `json:"image_length"`
22 UploadComplete *bool `json:"upload_complete"`
23 Description ImageRecordList `json:"description"`
26 type ImageRecordList struct {
27 ImageRecords []map[string]string `json:"image_records"`
30 // ImageKey is the key structure that is used in the database
31 type ImageKey struct {
32 // Owner string `json:"owner"`
33 // ClusterName string `json:"cluster_name"`
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)
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_image",
74 func NewContainerImageClient() *ImageClient {
76 storeName: "container_image",
81 func NewOSImageClient() *ImageClient {
83 storeName: "os_image",
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")
112 // Get returns Image for corresponding to name
113 func (v *ImageClient) Get(imageName string) (Image, error) {
115 //Construct the composite key to select the entry
118 // ClusterName: clusterName,
119 ImageName: imageName,
122 value, err := db.DBconn.Read(v.storeName, key, v.tagMeta)
124 return Image{}, pkgerrors.Wrap(err, "Get Image")
127 //value is a byte array
130 err = db.DBconn.Unmarshal(value, &c)
132 return Image{}, pkgerrors.Wrap(err, "Unmarshaling Value")
137 return Image{}, pkgerrors.New("Error getting Connection")
140 func (v *ImageClient) GetImageRecordByName(imgName string,
141 imageRecordName string) (map[string]string, error) {
143 img, err := v.Get(imgName)
145 return nil, pkgerrors.Wrap(err, "Error getting image")
148 for _, value := range img.Description.ImageRecords {
149 if imageRecordName == value["image_record_name"] {
154 return nil, pkgerrors.New("Image record " + imageRecordName + " not found")
157 // Delete the Image from database
158 func (v *ImageClient) Delete(imageName string) error {
160 //Construct the composite key to select the entry
163 // ClusterName: clusterName,
164 ImageName: imageName,
166 err := db.DBconn.Delete(v.storeName, key, v.tagMeta)
168 return pkgerrors.Wrap(err, "Delete Image")
173 // Update an entry for the image in the database
174 func (v *ImageClient) Update(imageName string, c Image) (Image, error) {
178 // ClusterName: c.ClusterName,
179 ImageName: imageName,
182 //Check if this Image exists
183 _, err := v.Get(imageName)
185 return Image{}, pkgerrors.New("Update Error - Image doesn't exist")
188 err = db.DBconn.Update(v.storeName, key, v.tagMeta, c)
190 return Image{}, pkgerrors.Wrap(err, "Updating DB Entry")