Skip to content

Reporting for multi-node EC installations #5246

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pkg/api/reporting/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ type ReportingInfo struct {
KURLInstallID string `json:"kurl_install_id" yaml:"kurl_install_id"`
EmbeddedClusterID string `json:"embedded_cluster_id" yaml:"embedded_cluster_id"`
EmbeddedClusterVersion string `json:"embedded_cluster_version" yaml:"embedded_cluster_version"`
EmbeddedClusterNodes string `json:"embedded_cluster_nodes" yaml:"embedded_cluster_nodes"`
IsGitOpsEnabled bool `json:"is_gitops_enabled" yaml:"is_gitops_enabled"`
GitOpsProvider string `json:"gitops_provider" yaml:"gitops_provider"`
SnapshotProvider string `json:"snapshot_provider" yaml:"snapshot_provider"`
Expand Down
6 changes: 3 additions & 3 deletions pkg/apiserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (
"github.com/replicatedhq/kots/pkg/binaries"
"github.com/replicatedhq/kots/pkg/handlers"
identitymigrate "github.com/replicatedhq/kots/pkg/identity/migrate"
"github.com/replicatedhq/kots/pkg/informers"
"github.com/replicatedhq/kots/pkg/k8sutil"
"github.com/replicatedhq/kots/pkg/operator"
operatorclient "github.com/replicatedhq/kots/pkg/operator/client"
Expand All @@ -31,6 +30,7 @@ import (
"github.com/replicatedhq/kots/pkg/updatechecker"
"github.com/replicatedhq/kots/pkg/upgradeservice"
"github.com/replicatedhq/kots/pkg/util"
"github.com/replicatedhq/kots/pkg/watchers"
"golang.org/x/crypto/bcrypt"
)

Expand Down Expand Up @@ -121,8 +121,8 @@ func Start(params *APIServerParams) {

supportbundle.StartServer()

if err := informers.Start(); err != nil {
log.Println("Failed to start informers:", err)
if err := watchers.Start(op.GetClusterID()); err != nil {
log.Println("Failed to start watchers:", err)
}

if err := updatechecker.Start(); err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ func nodeMetrics(ctx context.Context, client kubernetes.Interface, metricsClient
CPU: cpuCapacity,
Memory: memoryCapacity,
Pods: podCapacity,
Labels: nodeRolesFromLabels(node.Labels),
Roles: nodeRolesFromLabels(node.Labels),
Conditions: findNodeConditions(node.Status.Conditions),
PodList: podInfo,
}, nil
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion pkg/embeddedcluster/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ type Node struct {
CPU CapacityUsed `json:"cpu"`
Memory CapacityUsed `json:"memory"`
Pods CapacityUsed `json:"pods"`
Labels []string `json:"labels"`
Roles []string `json:"roles"`
Conditions NodeConditions `json:"conditions"`
PodList []PodInfo `json:"podList"`
}
Expand Down
116 changes: 0 additions & 116 deletions pkg/informers/informers.go

This file was deleted.

4 changes: 4 additions & 0 deletions pkg/operator/operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ func startLoop(fn func(), intervalInSeconds time.Duration) {
}()
}

func (o *Operator) GetClusterID() string {
return o.clusterID
}

func (o *Operator) resumeDeployments() {
apps, err := o.store.ListAppsForDownstream(o.clusterID)
if err != nil {
Expand Down
55 changes: 38 additions & 17 deletions pkg/reporting/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
downstreamtypes "github.com/replicatedhq/kots/pkg/api/downstream/types"
"github.com/replicatedhq/kots/pkg/api/reporting/types"
"github.com/replicatedhq/kots/pkg/buildversion"
"github.com/replicatedhq/kots/pkg/embeddedcluster"
"github.com/replicatedhq/kots/pkg/gitops"
"github.com/replicatedhq/kots/pkg/k8sutil"
"github.com/replicatedhq/kots/pkg/kotsadm"
Expand Down Expand Up @@ -120,18 +121,18 @@ func GetReportingInfo(appID string) *types.ReportingInfo {

cfg, err := k8sutil.GetClusterConfig()
if err != nil {
logger.Debugf("failed to get cluster config: %v", err.Error())
logger.Warnf("failed to get cluster config: %v", err.Error())
}

clientset, err := kubernetes.NewForConfig(cfg)
if err != nil {
logger.Debugf("failed to get clientset: %v", err.Error())
logger.Warnf("failed to get clientset: %v", err.Error())
}
r.ClusterID = k8sutil.GetKotsadmID(clientset)

di, err := getDownstreamInfo(appID)
if err != nil {
logger.Debugf("failed to get downstream info: %v", err.Error())
logger.Warnf("failed to get downstream info: %v", err.Error())
}
if di != nil {
r.Downstream = *di
Expand All @@ -140,7 +141,7 @@ func GetReportingInfo(appID string) *types.ReportingInfo {
// get kubernetes cluster version
k8sVersion, err := k8sutil.GetK8sVersion(clientset)
if err != nil {
logger.Debugf("failed to get k8s version: %v", err.Error())
logger.Warnf("failed to get k8s version: %v", err.Error())
} else {
r.K8sVersion = k8sVersion
}
Expand All @@ -152,26 +153,44 @@ func GetReportingInfo(appID string) *types.ReportingInfo {
// get app status
appStatus, err := store.GetStore().GetAppStatus(appID)
if err != nil {
logger.Debugf("failed to get app status: %v", err.Error())
logger.Warnf("failed to get app status: %v", err.Error())
} else {
r.AppStatus = string(appStatus.State)
}

// kurl
r.IsKurl, err = kurl.IsKurl(clientset)
if err != nil {
logger.Debugf(errors.Wrap(err, "failed to check if cluster is kurl").Error())
logger.Warnf(errors.Wrap(err, "failed to check if cluster is kurl").Error())
}

if r.IsKurl && clientset != nil {
kurlNodes, err := kurl.GetNodes(clientset)
if err != nil {
logger.Debugf(errors.Wrap(err, "failed to get kurl nodes").Error())
logger.Warnf(errors.Wrap(err, "failed to get kurl nodes").Error())
}
if kurlNodes != nil {
for _, kurlNode := range kurlNodes.Nodes {
r.KurlNodeCountTotal++
if kurlNode.IsConnected && kurlNode.IsReady {
r.KurlNodeCountReady++
}
}
}
}

for _, kurlNode := range kurlNodes.Nodes {
r.KurlNodeCountTotal++
if kurlNode.IsConnected && kurlNode.IsReady {
r.KurlNodeCountReady++
// embedded cluster
if util.IsEmbeddedCluster() && clientset != nil {
ecNodes, err := embeddedcluster.GetNodes(context.TODO(), clientset)
if err != nil {
logger.Warnf("failed to get embedded cluster nodes: %v", err.Error())
}
if ecNodes != nil {
marshalled, err := json.Marshal(ecNodes.Nodes)
if err != nil {
logger.Warnf("failed to marshal embedded cluster node: %v", err.Error())
} else {
r.EmbeddedClusterNodes = string(marshalled)
}
}
}
Expand All @@ -180,17 +199,17 @@ func GetReportingInfo(appID string) *types.ReportingInfo {

veleroClient, err := k8sutil.GetKubeClient(context.TODO())
if err != nil {
logger.Debugf("failed to get velero client: %v", err.Error())
logger.Warnf("failed to get velero client: %v", err.Error())
}

if clientset != nil && veleroClient != nil {
bsl, err := snapshot.FindBackupStoreLocation(context.TODO(), clientset, veleroClient, util.PodNamespace)
if err != nil {
logger.Debugf("failed to find backup store location: %v", err.Error())
logger.Warnf("failed to find backup store location: %v", err.Error())
} else {
report, err := getSnapshotReport(store.GetStore(), bsl, appID, r.ClusterID)
if err != nil {
logger.Debugf("failed to get snapshot report: %v", err.Error())
logger.Warnf("failed to get snapshot report: %v", err.Error())
} else {
r.SnapshotProvider = report.Provider
r.SnapshotFullSchedule = report.FullSchedule
Expand All @@ -212,7 +231,9 @@ func getDownstreamInfo(appID string) (*types.DownstreamInfo, error) {
return nil, errors.Wrap(err, "failed to list downstreams for app")
}
if len(downstreams) == 0 {
return nil, errors.New("no downstreams found for app")
// this can happen during initial install workflow until the app is installed and has downstreams
logger.Debugf("no downstreams found for app")
return nil, nil
}

currentVersion, err := store.GetStore().GetCurrentDownstreamVersion(appID, downstreams[0].ClusterID)
Expand Down Expand Up @@ -247,7 +268,7 @@ func getDownstreamInfo(appID string) (*types.DownstreamInfo, error) {

var preflightResults *troubleshootpreflight.UploadPreflightResults
if err := json.Unmarshal([]byte(currentVersion.PreflightResult), &preflightResults); err != nil {
logger.Debugf("failed to unmarshal preflight results: %v", err.Error())
logger.Warnf("failed to unmarshal preflight results: %v", err.Error())
}
di.PreflightState = getPreflightState(preflightResults)
di.SkipPreflights = currentVersion.PreflightSkipped
Expand All @@ -269,7 +290,7 @@ func getDownstreamInfo(appID string) (*types.DownstreamInfo, error) {
func getGitOpsReport(clientset kubernetes.Interface, appID string, clusterID string) (bool, string) {
gitOpsConfig, err := gitops.GetDownstreamGitOpsConfig(clientset, appID, clusterID)
if err != nil {
logger.Debugf("failed to get gitops config: %v", err.Error())
logger.Warnf("failed to get gitops config: %v", err.Error())
return false, ""
}

Expand Down
1 change: 1 addition & 0 deletions pkg/reporting/app_airgap.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ func BuildInstanceReport(licenseID string, reportingInfo *types.ReportingInfo) *
KurlInstallID: reportingInfo.KURLInstallID,
EmbeddedClusterID: reportingInfo.EmbeddedClusterID,
EmbeddedClusterVersion: reportingInfo.EmbeddedClusterVersion,
EmbeddedClusterNodes: reportingInfo.EmbeddedClusterNodes,
IsGitOpsEnabled: reportingInfo.IsGitOpsEnabled,
GitOpsProvider: reportingInfo.GitOpsProvider,
SnapshotProvider: reportingInfo.SnapshotProvider,
Expand Down
1 change: 1 addition & 0 deletions pkg/reporting/instance_report.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ type InstanceReportEvent struct {
KurlInstallID string `json:"kurl_install_id,omitempty"`
EmbeddedClusterID string `json:"embedded_cluster_id,omitempty"`
EmbeddedClusterVersion string `json:"embedded_cluster_version,omitempty"`
EmbeddedClusterNodes string `json:"embedded_cluster_nodes"`
IsGitOpsEnabled bool `json:"is_gitops_enabled"`
GitOpsProvider string `json:"gitops_provider"`
SnapshotProvider string `json:"snapshot_provider"`
Expand Down
1 change: 1 addition & 0 deletions pkg/reporting/report_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,7 @@ func createTestInstanceEvent(reportedAt int64) InstanceReportEvent {
KurlInstallID: "test-kurl-install-id",
EmbeddedClusterID: "test-embedded-cluster-id",
EmbeddedClusterVersion: "test-embedded-cluster-version",
EmbeddedClusterNodes: `[{"name":"node-1","isReady":true},{"name":"node-2","isReady":false},{"name":"node-3","isReady":true},{"name":"node-4","isReady":false}]`,
IsGitOpsEnabled: true,
GitOpsProvider: "test-gitops-provider",
SnapshotProvider: "test-snapshot-provider",
Expand Down
3 changes: 3 additions & 0 deletions pkg/reporting/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ func GetReportingInfoHeaders(reportingInfo *types.ReportingInfo) map[string]stri
if reportingInfo.EmbeddedClusterVersion != "" {
headers["X-Replicated-EmbeddedClusterVersion"] = reportingInfo.EmbeddedClusterVersion
}
if reportingInfo.EmbeddedClusterNodes != "" {
headers["X-Replicated-EmbeddedClusterNodes"] = reportingInfo.EmbeddedClusterNodes
}

headers["X-Replicated-KurlNodeCountTotal"] = strconv.Itoa(reportingInfo.KurlNodeCountTotal)
headers["X-Replicated-KurlNodeCountReady"] = strconv.Itoa(reportingInfo.KurlNodeCountReady)
Expand Down
Loading
Loading