| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572 |
- package v2
- import (
- "context"
- "encoding/json"
- "fmt"
- "github.com/porter-dev/porter/api/types"
- "github.com/porter-dev/porter/internal/telemetry"
- v1 "k8s.io/api/core/v1"
- "k8s.io/client-go/kubernetes"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- )
- // returns the agent service
- func GetAgentService(clientset kubernetes.Interface) (*v1.Service, error) {
- return clientset.CoreV1().Services("porter-agent-system").Get(
- context.TODO(),
- "porter-agent-controller-manager",
- metav1.GetOptions{},
- )
- }
- func ListPorterEvents(
- clientset kubernetes.Interface,
- service *v1.Service,
- req *types.ListEventsRequest,
- ) (*types.ListEventsResponse, error) {
- vals := make(map[string]string)
- if req.Type != nil {
- vals["type"] = *req.Type
- }
- if req.ReleaseName != nil {
- vals["release_name"] = *req.ReleaseName
- }
- if req.ReleaseNamespace != nil {
- vals["release_namespace"] = *req.ReleaseNamespace
- }
- if req.PaginationRequest != nil {
- vals["page"] = fmt.Sprintf("%d", req.PaginationRequest.Page)
- }
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- "/events",
- vals,
- )
- rawQuery, err := resp.DoRaw(context.Background())
- if err != nil {
- return nil, err
- }
- eventsResp := &types.ListEventsResponse{}
- err = json.Unmarshal(rawQuery, eventsResp)
- if err != nil {
- return nil, err
- }
- return eventsResp, nil
- }
- func ListPorterJobEvents(
- clientset kubernetes.Interface,
- service *v1.Service,
- req *types.ListJobEventsRequest,
- ) (*types.ListEventsResponse, error) {
- vals := make(map[string]string)
- vals["job_name"] = req.JobName
- if req.Type != nil {
- vals["type"] = *req.Type
- }
- if req.ReleaseName != nil {
- vals["release_name"] = *req.ReleaseName
- }
- if req.ReleaseNamespace != nil {
- vals["release_namespace"] = *req.ReleaseNamespace
- }
- if req.PaginationRequest != nil {
- vals["page"] = fmt.Sprintf("%d", req.PaginationRequest.Page)
- }
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- "/events/job",
- vals,
- )
- rawQuery, err := resp.DoRaw(context.Background())
- if err != nil {
- return nil, err
- }
- eventsResp := &types.ListEventsResponse{}
- err = json.Unmarshal(rawQuery, eventsResp)
- if err != nil {
- return nil, err
- }
- return eventsResp, nil
- }
- func ListIncidents(
- clientset kubernetes.Interface,
- service *v1.Service,
- req *types.ListIncidentsRequest,
- ) (*types.ListIncidentsResponse, error) {
- vals := make(map[string]string)
- if req.Status != nil {
- vals["status"] = string(*req.Status)
- }
- if req.ReleaseName != nil {
- vals["release_name"] = *req.ReleaseName
- }
- if req.ReleaseNamespace != nil {
- vals["release_namespace"] = *req.ReleaseNamespace
- }
- if req.PaginationRequest != nil {
- vals["page"] = fmt.Sprintf("%d", req.PaginationRequest.Page)
- }
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- "/incidents",
- vals,
- )
- rawQuery, err := resp.DoRaw(context.Background())
- if err != nil {
- return nil, err
- }
- incidentsResp := &types.ListIncidentsResponse{}
- err = json.Unmarshal(rawQuery, incidentsResp)
- if err != nil {
- return nil, err
- }
- return incidentsResp, nil
- }
- func GetIncidentByID(
- clientset kubernetes.Interface,
- service *v1.Service,
- incidentID string,
- ) (*types.Incident, error) {
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- fmt.Sprintf("/incidents/%s", incidentID),
- nil,
- )
- rawQuery, err := resp.DoRaw(context.Background())
- if err != nil {
- return nil, err
- }
- incident := &types.Incident{}
- if err := json.Unmarshal(rawQuery, incident); err != nil {
- return nil, err
- }
- return incident, nil
- }
- func ListIncidentEvents(
- clientset kubernetes.Interface,
- service *v1.Service,
- req *types.ListIncidentEventsRequest,
- ) (*types.ListIncidentEventsResponse, error) {
- vals := make(map[string]string)
- if req.IncidentID != nil {
- vals["incident_id"] = *req.IncidentID
- }
- if req.PodName != nil {
- vals["pod_name"] = *req.PodName
- }
- if req.PodNamespace != nil {
- vals["pod_namespace"] = *req.PodNamespace
- }
- if req.Summary != nil {
- vals["summary"] = *req.Summary
- }
- if req.PaginationRequest != nil {
- vals["page"] = fmt.Sprintf("%d", req.PaginationRequest.Page)
- }
- if req.PodPrefix != nil {
- vals["pod_prefix"] = *req.PodPrefix
- }
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- "/incidents/events",
- vals,
- )
- rawQuery, err := resp.DoRaw(context.Background())
- if err != nil {
- return nil, err
- }
- events := &types.ListIncidentEventsResponse{}
- if err := json.Unmarshal(rawQuery, events); err != nil {
- return nil, err
- }
- return events, nil
- }
- func GetHistoricalLogs(
- ctx context.Context,
- clientset kubernetes.Interface,
- service *v1.Service,
- req *types.GetLogRequest,
- ) (*types.GetLogResponse, error) {
- ctx, span := telemetry.NewSpan(ctx, "agent-get-historical-logs")
- defer span.End()
- vals := make(map[string]string)
- if req.Limit != 0 {
- vals["limit"] = fmt.Sprintf("%d", req.Limit)
- }
- if req.StartRange != nil {
- startVal, err := req.StartRange.MarshalText()
- if err != nil {
- return nil, telemetry.Error(ctx, span, err, "unable to marshal start range")
- }
- vals["start_range"] = string(startVal)
- }
- if req.EndRange != nil {
- endVal, err := req.EndRange.MarshalText()
- if err != nil {
- return nil, err
- }
- vals["end_range"] = string(endVal)
- }
- vals["pod_selector"] = req.PodSelector
- if req.Namespace != "" {
- vals["namespace"] = req.Namespace
- }
- vals["revision"] = req.Revision
- if req.SearchParam != "" {
- vals["search_param"] = req.SearchParam
- }
- if req.Direction != "" {
- vals["direction"] = req.Direction
- }
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- "/logs",
- vals,
- )
- rawQuery, err := resp.DoRaw(ctx)
- if err != nil {
- return nil, telemetry.Error(ctx, span, err, "unable to do get raw response")
- }
- logsResp := &types.GetLogResponse{}
- err = json.Unmarshal(rawQuery, logsResp)
- if err != nil {
- return nil, telemetry.Error(ctx, span, err, "unable to unmarshal logs response")
- }
- return logsResp, nil
- }
- // Logs returns logs from the porter agent matching the provided labels and other query parameters
- func Logs(
- ctx context.Context,
- clientset kubernetes.Interface,
- service *v1.Service,
- req *types.LogRequest,
- ) (*types.GetLogResponse, error) {
- ctx, span := telemetry.NewSpan(ctx, "agent-get-logs")
- defer span.End()
- vals := make(map[string]string)
- if req.Limit != 0 {
- vals["limit"] = fmt.Sprintf("%d", req.Limit)
- }
- if req.StartRange != nil {
- startVal, err := req.StartRange.MarshalText()
- if err != nil {
- return nil, telemetry.Error(ctx, span, err, "unable to marshal start range")
- }
- vals["start_range"] = string(startVal)
- }
- if req.EndRange != nil {
- endVal, err := req.EndRange.MarshalText()
- if err != nil {
- return nil, telemetry.Error(ctx, span, err, "unable to marshal end range")
- }
- vals["end_range"] = string(endVal)
- }
- if req.SearchParam != "" {
- vals["search_param"] = req.SearchParam
- }
- if req.Direction != "" {
- vals["direction"] = req.Direction
- }
- if req.MatchLabels != nil {
- json, err := json.Marshal(req.MatchLabels)
- if err != nil {
- return nil, fmt.Errorf("error marshalling match labels map to json: %w", err)
- }
- vals["match_labels_json"] = string(json)
- }
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- "/logs",
- vals,
- )
- rawQuery, err := resp.DoRaw(ctx)
- if err != nil {
- return nil, telemetry.Error(ctx, span, err, "unable to get raw response")
- }
- logsResp := &types.GetLogResponse{}
- err = json.Unmarshal(rawQuery, logsResp)
- if err != nil {
- return nil, telemetry.Error(ctx, span, err, "unable to unmarshal logs response")
- }
- return logsResp, nil
- }
- func GetPodValues(
- clientset kubernetes.Interface,
- service *v1.Service,
- req *types.GetPodValuesRequest,
- ) ([]string, error) {
- vals := make(map[string]string)
- if req.StartRange != nil {
- startVal, err := req.StartRange.MarshalText()
- if err != nil {
- return nil, err
- }
- vals["start_range"] = string(startVal)
- }
- if req.EndRange != nil {
- endVal, err := req.EndRange.MarshalText()
- if err != nil {
- return nil, err
- }
- vals["end_range"] = string(endVal)
- }
- vals["match_prefix"] = req.MatchPrefix
- vals["revision"] = req.Revision
- vals["namespace"] = req.Namespace
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- "/logs/pod_values",
- vals,
- )
- rawQuery, err := resp.DoRaw(context.Background())
- if err != nil {
- return nil, err
- }
- valsResp := make([]string, 0)
- err = json.Unmarshal(rawQuery, &valsResp)
- if err != nil {
- return nil, err
- }
- return valsResp, nil
- }
- func GetRevisionValues(
- clientset kubernetes.Interface,
- service *v1.Service,
- req *types.GetRevisionValuesRequest,
- ) ([]string, error) {
- vals := make(map[string]string)
- if req.StartRange != nil {
- startVal, err := req.StartRange.MarshalText()
- if err != nil {
- return nil, err
- }
- vals["start_range"] = string(startVal)
- }
- if req.EndRange != nil {
- endVal, err := req.EndRange.MarshalText()
- if err != nil {
- return nil, err
- }
- vals["end_range"] = string(endVal)
- }
- vals["match_prefix"] = req.MatchPrefix
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- "/logs/revision_values",
- vals,
- )
- rawQuery, err := resp.DoRaw(context.Background())
- if err != nil {
- return nil, err
- }
- valsResp := make([]string, 0)
- err = json.Unmarshal(rawQuery, &valsResp)
- if err != nil {
- return nil, err
- }
- return valsResp, nil
- }
- func GetHistoricalKubernetesEvents(
- clientset kubernetes.Interface,
- service *v1.Service,
- req *types.GetKubernetesEventRequest,
- ) (*types.GetKubernetesEventResponse, error) {
- vals := make(map[string]string)
- if req.Limit != 0 {
- vals["limit"] = fmt.Sprintf("%d", req.Limit)
- }
- if req.StartRange != nil {
- startVal, err := req.StartRange.MarshalText()
- if err != nil {
- return nil, err
- }
- vals["start_range"] = string(startVal)
- }
- if req.EndRange != nil {
- endVal, err := req.EndRange.MarshalText()
- if err != nil {
- return nil, err
- }
- vals["end_range"] = string(endVal)
- }
- vals["pod_selector"] = req.PodSelector
- vals["namespace"] = req.Namespace
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- "/events",
- vals,
- )
- rawQuery, err := resp.DoRaw(context.Background())
- if err != nil {
- return nil, err
- }
- eventsResp := &types.GetKubernetesEventResponse{}
- err = json.Unmarshal(rawQuery, eventsResp)
- if err != nil {
- return nil, err
- }
- return eventsResp, nil
- }
- func GetAgentStatus(
- clientset kubernetes.Interface,
- service *v1.Service,
- ) (*types.GetAgentStatusResponse, error) {
- resp := clientset.CoreV1().Services(service.Namespace).ProxyGet(
- "http",
- service.Name,
- fmt.Sprintf("%d", service.Spec.Ports[0].Port),
- "/status",
- nil,
- )
- rawQuery, err := resp.DoRaw(context.Background())
- if err != nil {
- return nil, err
- }
- statusResp := &types.GetAgentStatusResponse{}
- err = json.Unmarshal(rawQuery, statusResp)
- if err != nil {
- return nil, err
- }
- return statusResp, nil
- }
|