diff --git a/main b/main new file mode 100755 index 0000000..6500bb2 Binary files /dev/null and b/main differ diff --git a/server/handler/vmModify.go b/server/handler/vmModify.go index a580a2a..d52f44b 100644 --- a/server/handler/vmModify.go +++ b/server/handler/vmModify.go @@ -24,6 +24,8 @@ func (h *Handler) VmModify(w http.ResponseWriter, r *http.Request) { params := queries.CreateUpdateParams{} var unixTimestamp int64 + //re := regexp.MustCompile(`/([^/]+)/[^/]+\.vmdk$`) + reqBody, err := io.ReadAll(r.Body) if err != nil { h.Logger.Error("Invalid data received", "error", err) @@ -52,7 +54,17 @@ func (h *Handler) VmModify(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusAccepted) fmt.Fprintf(w, "Processed update event but no config changes were found\n") } else { - h.Logger.Debug("Received event contains config change info", "source", event.CloudEvent.Source, "vm", event.CloudEvent.Data.VM.Name) + h.Logger.Debug("Received event contains config change info", "source", event.CloudEvent.Source, + "vm", event.CloudEvent.Data.VM.Name, "user_name", event.CloudEvent.Data.UserName) + + // Try to decode the config changes data + var testConfig models.ConfigSpec + if err := json.Unmarshal(*event.CloudEvent.Data.ConfigSpec, &testConfig); err != nil { + h.Logger.Warn("unable to decode ConfigSpec json", "error", err) + } else { + h.Logger.Debug("successfully decoded ConfigSpec JSON") + } + configChanges = h.processConfigChanges(event.CloudEvent.Data.ConfigChanges.Modified) //prettyPrint(configChanges) @@ -85,6 +97,15 @@ func (h *Handler) VmModify(w http.ResponseWriter, r *http.Request) { if strings.Contains(change["type"], "config.hardware.device") && strings.Contains(event.CloudEvent.Data.FullFormattedMessage, ".vmdk") { + // TODO - query current disk size from Inventory table and only create an update if the size is now changed + if testConfig.DeviceChange != nil { + for i := range testConfig.DeviceChange { + if testConfig.DeviceChange[i].Device.Backing != nil { + h.Logger.Debug("Found backing in configspec", "backing", testConfig.DeviceChange[i].Device.Backing) + } + } + } + // TODO - recalculate total disk size h.Logger.Debug("Detected config change for VM disk") found = true diff --git a/server/models/models.go b/server/models/models.go index dd9f8c8..80bb956 100644 --- a/server/models/models.go +++ b/server/models/models.go @@ -101,37 +101,9 @@ type ConfigSpec struct { DeviceChange []struct { Backing any `json:"Backing"` Device struct { - Backing struct { - Port struct { - ConnectionCookie int `json:"ConnectionCookie"` - PortKey string `json:"PortKey"` - PortgroupKey string `json:"PortgroupKey"` - SwitchUUID string `json:"SwitchUuid"` - } `json:"Port"` - BackingObjectID string `json:"BackingObjectId"` - ChangeID string `json:"ChangeId"` - ContentID string `json:"ContentId"` - Datastore struct { - Type string `json:"Type"` - Value string `json:"Value"` - } `json:"Datastore"` - DeltaDiskFormat string `json:"DeltaDiskFormat"` - DeltaDiskFormatVariant string `json:"DeltaDiskFormatVariant"` - DeltaGrainSize int `json:"DeltaGrainSize"` - DigestEnabled any `json:"DigestEnabled"` - DiskMode string `json:"DiskMode"` - EagerlyScrub bool `json:"EagerlyScrub"` - FileName string `json:"FileName"` - KeyID any `json:"KeyId"` - Parent any `json:"Parent"` - Sharing string `json:"Sharing"` - Split any `json:"Split"` - ThinProvisioned bool `json:"ThinProvisioned"` - UUID string `json:"Uuid"` - WriteThrough any `json:"WriteThrough"` - } `json:"Backing"` - CapacityInBytes int `json:"CapacityInBytes"` - CapacityInKB int `json:"CapacityInKB"` + Backing *BackingSpec `json:"Backing,omitempty"` + CapacityInBytes int `json:"CapacityInBytes"` + CapacityInKB int `json:"CapacityInKB"` Connectable struct { AllowGuestControl bool `json:"AllowGuestControl"` Connected bool `json:"Connected"` @@ -173,7 +145,7 @@ type ConfigSpec struct { } `json:"StorageIOAllocation"` VDiskID any `json:"VDiskId"` VFlashCacheConfigInfo any `json:"VFlashCacheConfigInfo"` - } `json:"Device"` + } `json:"Device,omitempty"` FileOperation string `json:"FileOperation"` Operation string `json:"Operation"` Profile []struct { @@ -243,3 +215,33 @@ type ConfigSpec struct { VirtualSMCPresent any `json:"VirtualSMCPresent"` VMProfile any `json:"VmProfile"` } + +type BackingSpec struct { + Port struct { + ConnectionCookie int `json:"ConnectionCookie"` + PortKey string `json:"PortKey"` + PortgroupKey string `json:"PortgroupKey"` + SwitchUUID string `json:"SwitchUuid"` + } `json:"Port"` + BackingObjectID string `json:"BackingObjectId"` + ChangeID string `json:"ChangeId"` + ContentID string `json:"ContentId"` + Datastore struct { + Type string `json:"Type"` + Value string `json:"Value"` + } `json:"Datastore"` + DeltaDiskFormat string `json:"DeltaDiskFormat"` + DeltaDiskFormatVariant string `json:"DeltaDiskFormatVariant"` + DeltaGrainSize int `json:"DeltaGrainSize"` + DigestEnabled any `json:"DigestEnabled"` + DiskMode string `json:"DiskMode"` + EagerlyScrub bool `json:"EagerlyScrub"` + FileName string `json:"FileName"` + KeyID any `json:"KeyId"` + Parent any `json:"Parent"` + Sharing string `json:"Sharing"` + Split any `json:"Split"` + ThinProvisioned bool `json:"ThinProvisioned"` + UUID string `json:"Uuid"` + WriteThrough any `json:"WriteThrough"` +}