Skip to content

Instantly share code, notes, and snippets.

@zakisk
Created October 9, 2023 13:51
Show Gist options
  • Save zakisk/2276d503b2e67253a4bc1aea8a233ecf to your computer and use it in GitHub Desktop.
Save zakisk/2276d503b2e67253a4bc1aea8a233ecf to your computer and use it in GitHub Desktop.
How to send events from Golang
func (h *Handler) KubernetesPingHandler(w http.ResponseWriter, req *http.Request, _ *models.Preference, user *models.User, provider models.Provider) {
userID := uuid.FromStringOrNil(user.ID)
token, ok := req.Context().Value(models.TokenCtxKey).(string)
if !ok {
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "failed to get the token for the user")
return
}
connectionID := req.URL.Query().Get("connection_id")
eventBuilder := events.NewEvent().FromUser(userID).FromSystem(*h.SystemID).WithCategory("connection").WithAction("ping")
if connectionID != "" {
// Get the context associated with this ID
k8sContext, err := provider.GetK8sContext(token, connectionID)
eventBuilder.ActedUpon(uuid.FromStringOrNil(k8sContext.ConnectionID))
if err != nil {
eventBuilder.WithSeverity(events.Error).WithDescription(fmt.Sprintf("Encountered an issue while retrieving kubernetes context for connection ID `%s`", connectionID)).
WithMetadata(map[string]interface{}{
"error": err,
"probable_cause": "Meshery might not be able to access Kubeconfig.",
"suggested_remediation": "Please ensure that Mehsery can establish connectivity with kubernetes.",
})
h.broadcastEvent(eventBuilder, provider, userID)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "failed to get kubernetes context for the given ID")
return
}
eventBuilder.WithSeverity(events.Success).WithDescription("Retrieved kubernetes context successfully").
WithMetadata(map[string]interface{}{
"context_name": k8sContext.Name,
"server": k8sContext.Server,
})
h.broadcastEvent(eventBuilder, provider, userID)
// Create handler for the context
kubeclient, err := k8sContext.GenerateKubeHandler()
if err != nil {
eventBuilder.WithSeverity(events.Error).WithDescription(fmt.Sprintf("Encountered an issue while creating kubernetes client for the context `%s`", k8sContext.Name)).
WithMetadata(map[string]interface{}{
"error": err,
"server": k8sContext.Server,
"probable_cause": "Meshery might not be able to access Kubernetes cluster.",
"suggested_remediation": "Please ensure that Meshery can establish connectivity with kubernetes.",
})
h.broadcastEvent(eventBuilder, provider, userID)
w.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(w, "failed to get kubernetes config for the user")
return
}
version, err := kubeclient.KubeClient.ServerVersion()
if err != nil {
eventBuilder.WithSeverity(events.Error).WithDescription(fmt.Sprintf("Encountered an issue while retrieving kubernetes version for the context `%s`", k8sContext.Name)).
WithMetadata(map[string]interface{}{
"error": err,
"server": k8sContext.Server,
"probable_cause": "Meshery might not be able to access Kubernetes cluster.",
"suggested_remediation": "Please ensure that Meshery can establish connectivity with kubernetes.",
})
h.broadcastEvent(eventBuilder, provider, userID)
logrus.Error(ErrKubeVersion(err))
http.Error(w, ErrKubeVersion(err).Error(), http.StatusInternalServerError)
return
}
eventBuilder.WithSeverity(events.Success).WithDescription("Successfully generated kubernetes client").
WithMetadata(map[string]interface{}{
"kubernetes_version": version,
"host": kubeclient.RestConfig.Host,
})
h.broadcastEvent(eventBuilder, provider, userID)
if err = json.NewEncoder(w).Encode(map[string]string{
"server_version": version.String(),
}); err != nil {
err = errors.Wrap(err, "unable to marshal the payload")
logrus.Error(models.ErrMarshal(err, "kube-server-version"))
http.Error(w, models.ErrMarshal(err, "kube-server-version").Error(), http.StatusInternalServerError)
}
return
}
eventBuilder.WithSeverity(events.Error).WithDescription("Encountered an issue while retrieving context ID").
WithMetadata(map[string]interface{}{
"error": "empty context ID",
"probable_cause": "you may have provided empty connection ID in query parameter.",
"suggested_remediation": "Please ensure that you've provided context ID(in query parameter \"context\") of the kuberenetes cluster you want to be pinged.",
})
h.broadcastEvent(eventBuilder, provider, userID)
http.Error(w, "Empty contextID. Pass the context ID(in query parameter \"context\") of the kuberenetes to be pinged", http.StatusBadRequest)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment