mirror of
https://github.com/stakater/Reloader.git
synced 2026-02-14 09:59:50 +00:00
135 lines
4.1 KiB
Go
135 lines
4.1 KiB
Go
package common
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"runtime"
|
|
"time"
|
|
|
|
v1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
)
|
|
|
|
// Version, Commit, and BuildDate are set during the build process
|
|
// using the -X linker flag to inject these values into the binary.
|
|
// They provide metadata about the build version, commit hash, build date, and whether there are
|
|
// uncommitted changes in the source code at the time of build.
|
|
// This information is useful for debugging and tracking the specific build of the Reloader binary.
|
|
var Version = "dev"
|
|
var Commit = "unknown"
|
|
var BuildDate = "unknown"
|
|
var Edition = "oss"
|
|
|
|
const (
|
|
MetaInfoConfigmapName = "reloader-meta-info"
|
|
MetaInfoConfigmapLabelKey = "reloader.stakater.com/meta-info"
|
|
MetaInfoConfigmapLabelValue = "reloader"
|
|
)
|
|
|
|
// MetaInfo contains comprehensive metadata about the Reloader instance.
|
|
// This includes build information, configuration options, and deployment details.
|
|
type MetaInfo struct {
|
|
// BuildInfo contains information about the build version, commit, and compilation details
|
|
BuildInfo BuildInfo `json:"buildInfo"`
|
|
// ReloaderOptions contains all the configuration options and flags used by this Reloader instance
|
|
ReloaderOptions ReloaderOptions `json:"reloaderOptions"`
|
|
// DeploymentInfo contains metadata about the Kubernetes deployment of this Reloader instance
|
|
DeploymentInfo metav1.ObjectMeta `json:"deploymentInfo"`
|
|
}
|
|
|
|
// BuildInfo contains information about the build and version of the Reloader binary.
|
|
// This includes Go version, release version, commit details, and build timestamp.
|
|
type BuildInfo struct {
|
|
// GoVersion is the version of Go used to compile the binary
|
|
GoVersion string `json:"goVersion"`
|
|
// ReleaseVersion is the version tag or branch of the Reloader release
|
|
ReleaseVersion string `json:"releaseVersion"`
|
|
// CommitHash is the Git commit hash of the source code used to build this binary
|
|
CommitHash string `json:"commitHash"`
|
|
// CommitTime is the timestamp of the Git commit used to build this binary
|
|
CommitTime time.Time `json:"commitTime"`
|
|
|
|
// Edition indicates the edition of Reloader (e.g., OSS, Enterprise)
|
|
Edition string `json:"edition"`
|
|
}
|
|
|
|
func NewBuildInfo() *BuildInfo {
|
|
metaInfo := &BuildInfo{
|
|
GoVersion: runtime.Version(),
|
|
ReleaseVersion: Version,
|
|
CommitHash: Commit,
|
|
CommitTime: ParseUTCTime(BuildDate),
|
|
Edition: Edition,
|
|
}
|
|
|
|
return metaInfo
|
|
}
|
|
|
|
func (m *MetaInfo) ToConfigMap() *v1.ConfigMap {
|
|
return &v1.ConfigMap{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: MetaInfoConfigmapName,
|
|
Namespace: m.DeploymentInfo.Namespace,
|
|
Labels: map[string]string{
|
|
MetaInfoConfigmapLabelKey: MetaInfoConfigmapLabelValue,
|
|
},
|
|
},
|
|
Data: map[string]string{
|
|
"buildInfo": toJson(m.BuildInfo),
|
|
"reloaderOptions": toJson(m.ReloaderOptions),
|
|
"deploymentInfo": toJson(m.DeploymentInfo),
|
|
},
|
|
}
|
|
}
|
|
|
|
func NewMetaInfo(configmap *v1.ConfigMap) (*MetaInfo, error) {
|
|
var buildInfo BuildInfo
|
|
if val, ok := configmap.Data["buildInfo"]; ok {
|
|
err := json.Unmarshal([]byte(val), &buildInfo)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal buildInfo: %w", err)
|
|
}
|
|
}
|
|
|
|
var reloaderOptions ReloaderOptions
|
|
if val, ok := configmap.Data["reloaderOptions"]; ok {
|
|
err := json.Unmarshal([]byte(val), &reloaderOptions)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal reloaderOptions: %w", err)
|
|
}
|
|
}
|
|
|
|
var deploymentInfo metav1.ObjectMeta
|
|
if val, ok := configmap.Data["deploymentInfo"]; ok {
|
|
err := json.Unmarshal([]byte(val), &deploymentInfo)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal deploymentInfo: %w", err)
|
|
}
|
|
}
|
|
|
|
return &MetaInfo{
|
|
BuildInfo: buildInfo,
|
|
ReloaderOptions: reloaderOptions,
|
|
DeploymentInfo: deploymentInfo,
|
|
}, nil
|
|
}
|
|
|
|
func toJson(data interface{}) string {
|
|
jsonData, err := json.Marshal(data)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return string(jsonData)
|
|
}
|
|
|
|
func ParseUTCTime(value string) time.Time {
|
|
if value == "" {
|
|
return time.Time{} // Return zero time if value is empty
|
|
}
|
|
t, err := time.Parse(time.RFC3339, value)
|
|
if err != nil {
|
|
return time.Time{} // Return zero time if parsing fails
|
|
}
|
|
return t
|
|
}
|