From adb547d28f4ce84a93f71c1bbee748f5cf63eaed Mon Sep 17 00:00:00 2001 From: sachin shingare <35319163+sachin120@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:29:41 +0530 Subject: [PATCH] feat: add events API endpoint interaction (#54) --- api/events.go | 8 ++++++++ client/client.go | 2 ++ client/events.go | 32 ++++++++++++++++++++++++++++++++ entity/event/event.go | 2 ++ entity/event/types.go | 14 ++++++++++++++ entity/events.go | 37 +++++++++++++++++++++++++++++++++++++ 6 files changed, 95 insertions(+) create mode 100644 api/events.go create mode 100644 client/events.go create mode 100644 entity/event/event.go create mode 100644 entity/event/types.go create mode 100644 entity/events.go diff --git a/api/events.go b/api/events.go new file mode 100644 index 0000000..71c6f45 --- /dev/null +++ b/api/events.go @@ -0,0 +1,8 @@ +package api + +import "github.com/maas/gomaasclient/entity" + +// Events is an interface for node events +type Events interface { + Get(params *entity.EventParams) (*entity.EventsResp, error) +} diff --git a/client/client.go b/client/client.go index 02e5d3d..b1e62b3 100644 --- a/client/client.go +++ b/client/client.go @@ -40,6 +40,7 @@ func constructClient(apiClient *APIClient) *Client { DNSResources: &DNSResources{APIClient: *apiClient}, DNSResourceRecord: &DNSResourceRecord{APIClient: *apiClient}, DNSResourceRecords: &DNSResourceRecords{APIClient: *apiClient}, + Events: &Events{APIClient: *apiClient}, Fabric: &Fabric{APIClient: *apiClient}, Fabrics: &Fabrics{APIClient: *apiClient}, VLAN: &VLAN{APIClient: *apiClient}, @@ -105,6 +106,7 @@ type Client struct { DNSResourceRecords api.DNSResourceRecords Domain api.Domain Domains api.Domains + Events api.Events Fabric api.Fabric Fabrics api.Fabrics VLAN api.VLAN diff --git a/client/events.go b/client/events.go new file mode 100644 index 0000000..caa7c37 --- /dev/null +++ b/client/events.go @@ -0,0 +1,32 @@ +package client + +import ( + "encoding/json" + + "github.com/google/go-querystring/query" + "github.com/maas/gomaasclient/entity" +) + +// Events implements api.Events +type Events struct { + APIClient APIClient +} + +func (e *Events) client() APIClient { + return e.APIClient.GetSubObject("events") +} + +// Get events for nodes +func (e *Events) Get(params *entity.EventParams) (*entity.EventsResp, error) { + qsp, err := query.Values(params) + if err != nil { + return nil, err + } + + events := &entity.EventsResp{} + err = e.client().Get("query", qsp, func(data []byte) error { + return json.Unmarshal(data, events) + }) + + return events, err +} diff --git a/entity/event/event.go b/entity/event/event.go new file mode 100644 index 0000000..44e1b36 --- /dev/null +++ b/entity/event/event.go @@ -0,0 +1,2 @@ +// Package event contains entities related to events. +package event diff --git a/entity/event/types.go b/entity/event/types.go new file mode 100644 index 0000000..2db9233 --- /dev/null +++ b/entity/event/types.go @@ -0,0 +1,14 @@ +package event + +// LogLevel correlates to a log level for MAAS events. +type LogLevel string + +// Log levels referring from MAAS server https://github.com/maas/maas/blob/master/src/maasserver/models/eventtype.py#L25 +const ( + AUDIT LogLevel = "AUDIT" + CRITICAL LogLevel = "CRITICAL" + DEBUG LogLevel = "DEBUG" + ERROR LogLevel = "ERROR" + WARNING LogLevel = "WARNING" + INFO LogLevel = "INFO" +) diff --git a/entity/events.go b/entity/events.go new file mode 100644 index 0000000..6741aa0 --- /dev/null +++ b/entity/events.go @@ -0,0 +1,37 @@ +package entity + +import "github.com/maas/gomaasclient/entity/event" + +// Event represents an event for MAAS node +type Event struct { + UserName string `json:"username,omitempty"` + Node string `json:"node,omitempty"` + Hostname string `json:"hostname,omitempty"` + Created string `json:"created,omitempty"` + Type string `json:"type,omitempty"` + Description string `json:"description,omitempty"` + Level event.LogLevel `json:"level,omitempty"` + ID int `json:"id,omitempty"` +} + +// EventsResp represents the MAAS Events endpoint +type EventsResp struct { + NextURI string `json:"next_uri,omitempty"` + PrevURI string `json:"prev_uri,omitempty"` + Events []Event `json:"events,omitempty"` + Count int `json:"count,omitempty"` +} + +// EventParams enumerates the parameters for the event get operation +type EventParams struct { + Hostname string `url:"hostname,omitempty"` + MACAddress string `url:"mac_address,omitempty"` + ID string `url:"id,omitempty"` + Zone string `url:"zone,omitempty"` + AgentName string `url:"agent_name,omitempty"` + Limit string `url:"limit,omitempty"` + Before string `url:"before,omitempty"` + After string `url:"after,omitempty"` + Owner string `url:"owner,omitempty"` + Level event.LogLevel `url:"level,omitempty"` +}