UNCLASSIFIED

Commit 9a78e6ca authored by Matt Vasquez's avatar Matt Vasquez
Browse files

Merge branch 'mdb-153-fixes' into 'development'

Fixing the image: using the official image as a base

See merge request !2
parents 0074177c 1f5be9b0
Pipeline #32214 failed with stage
......@@ -4,19 +4,12 @@ ARG BASE_REGISTRY=nexus-docker-secure.levelup-nexus.svc.cluster.local:18082
ARG BASE_IMAGE=redhat/ubi/ubi7
ARG BASE_TAG=7.8
FROM golang:1.13 as builder
ARG VERSION=1.0.0
USER root
RUN mkdir /build
ADD . /build/
WORKDIR /build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -a -i -o ./output/mmsconfiguration ./mmsconfiguration
#####
FROM quay.io/mongodb/mongodb-enterprise-init-ops-manager:${VERSION} as official
FROM ${BASE_REGISTRY}/${BASE_IMAGE}:${BASE_TAG}
ARG VERSION
LABEL name="MongoDB Enterprise Ops Manager Init" \
maintainer="support@mongodb.com" \
......@@ -26,12 +19,9 @@ LABEL name="MongoDB Enterprise Ops Manager Init" \
summary="MongoDB Enterprise Ops Manager Init Image" \
description="Startup Scripts for MongoDB Enterprise Ops Manager"
RUN mkdir /scripts && mkdir -p /licenses
COPY --from=builder /build/output/mmsconfiguration /scripts/
COPY scripts/docker-entry-point.sh /scripts/
COPY LICENSE /licenses/mongodb-enterprise-ops-manager
COPY --from=official /scripts/mmsconfiguration /scripts/
COPY --from=official /licenses/mongodb-enterprise-ops-manager /licenses/
COPY ./scripts/docker-entry-point.sh /scripts/
USER 2000
ENTRYPOINT [ "/bin/cp", "-f", "/scripts/docker-entry-point.sh", "/scripts/mmsconfiguration", "/opt/scripts/" ]
......
@Library('DCCSCR@master') _
dccscrPipeline(version: "1.5.3")
dccscrPipeline(version: "1.0.1")
{
"resources": [
{
"url": "docker://docker.io/golang@sha256:2841da2227dc15e18ca5ec1e95f3cb166005361c0eb0313ce82d2e5ccff116dd",
"tag": "golang:1.13"
"url": "docker://quay.io/mongodb/mongodb-enterprise-init-ops-manager@sha256:3577d0279a4a6fa409374d5a11a986ea93bf015a998fffe8a78de4d78c3e6b0d",
"tag": "quay.io/mongodb/mongodb-enterprise-init-ops-manager:1.0.0"
}
]
}
package main
import (
"fmt"
"io/ioutil"
"os"
"strings"
)
const (
mmsJvmParamsVar = "JAVA_MMS_UI_OPTS"
backupDaemonJvmParamsVar = "JAVA_DAEMON_OPTS"
omPropertyPrefix = "OM_PROP_"
lineBreak = "\n"
commentPrefix = "#"
propOverwriteFmt = "%s=\"${%s} %s\""
backupDaemon = "BACKUP_DAEMON"
)
func updateConfFile(confFile string) error {
confFilePropertyName := mmsJvmParamsVar
if _, isBackupDaemon := os.LookupEnv(backupDaemon); isBackupDaemon {
confFilePropertyName = backupDaemonJvmParamsVar
}
customJvmParamsVar := "CUSTOM_" + confFilePropertyName
jvmParams, jvmParamsEnvVarExists := os.LookupEnv(customJvmParamsVar)
if !jvmParamsEnvVarExists || jvmParams == "" {
fmt.Printf("%s not specified, not modifying %s\n", customJvmParamsVar, confFile)
return nil
}
newMmsJvmParams := fmt.Sprintf(propOverwriteFmt, confFilePropertyName, confFilePropertyName, jvmParams)
fmt.Printf("Appending %s to %s\n", newMmsJvmParams, confFile)
err := appendLinesToFile(confFile, getJvmParamDocString()+newMmsJvmParams+lineBreak)
return err
}
func updatePropertiesFile(propertiesFile string) error {
newProperties := getOmPropertiesFromEnvVars()
// If there are no exported mms properties, we can stop here
if len(newProperties) == 0 {
return nil
}
lines, err := readLinesFromFile(propertiesFile)
if err != nil {
return err
}
lines = updateMmsProperties(lines, newProperties)
fmt.Printf("Updating configuration properties file %s\n", propertiesFile)
err = writeLinesToFile(propertiesFile, lines)
return err
}
func readLinesFromFile(name string) ([]string, error) {
input, err := ioutil.ReadFile(name)
if err != nil {
return nil, fmt.Errorf("error reading file %s: %v", name, err)
}
return strings.Split(string(input), lineBreak), nil
}
func writeLinesToFile(name string, lines []string) error {
output := strings.Join(lines, lineBreak)
err := ioutil.WriteFile(name, []byte(output), 0775)
if err != nil {
return fmt.Errorf("error writing to file %s: %v", name, err)
}
return nil
}
func appendLinesToFile(name string, lines string) error {
f, err := os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
return fmt.Errorf("error opening file %s: %v", name, err)
}
if _, err = f.WriteString(lines); err != nil {
return fmt.Errorf("error writing to file %s: %v", name, err)
}
err = f.Close()
return err
}
func getOmPropertiesFromEnvVars() map[string]string {
props := map[string]string{}
for _, pair := range os.Environ() {
if !strings.HasPrefix(pair, omPropertyPrefix) {
continue
}
p := strings.SplitN(pair, "=", 2)
key := strings.Replace(p[0], omPropertyPrefix, "", 1)
key = strings.ReplaceAll(key, "_", ".")
props[key] = p[1]
}
return props
}
func updateMmsProperties(lines []string, newProperties map[string]string) []string {
seenProperties := map[string]bool{}
// Overwrite existing properties
for i, line := range lines {
if strings.HasPrefix(line, commentPrefix) || !strings.Contains(line, "=") {
continue
}
key := strings.Split(line, "=")[0]
if newVal, ok := newProperties[key]; ok {
lines[i] = fmt.Sprintf("%s=%s", key, newVal)
fmt.Printf("Setting %s=%s\n", key, newVal)
seenProperties[key] = true
}
}
// Add new properties
for key, val := range newProperties {
if _, ok := seenProperties[key]; !ok {
lines = append(lines, fmt.Sprintf("%s=%s", key, val))
fmt.Printf("Added %s=%s\n", key, val)
}
}
return lines
}
func getJvmParamDocString() string {
commentMarker := strings.Repeat("#", 55)
return fmt.Sprintf("%s\n## This is the custom JVM configuration set by the Operator\n%s\n\n", commentMarker, commentMarker)
}
func main() {
if len(os.Args) < 3 {
fmt.Printf("Incorrect arguments %s, must specify path to conf file and path to properties file"+lineBreak, os.Args[1:])
os.Exit(1)
}
confFile := os.Args[1]
propertiesFile := os.Args[2]
if err := updateConfFile(confFile); err != nil {
fmt.Println(err)
os.Exit(1)
}
if err := updatePropertiesFile(propertiesFile); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
package main
import (
"fmt"
"io/ioutil"
"math/rand"
"os"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func TestEditMmsConfiguration_UpdateConfFile_Mms(t *testing.T) {
confFile := _createTestConfFile()
_ = os.Setenv("CUSTOM_JAVA_MMS_UI_OPTS", "-Xmx4000m -Xms4000m")
err := updateConfFile(confFile)
assert.NoError(t, err)
updatedContent := _readLinesFromFile(confFile)
assert.Equal(t, updatedContent[7], "JAVA_MMS_UI_OPTS=\"${JAVA_MMS_UI_OPTS} -Xmx4000m -Xms4000m\"")
}
func TestEditMmsConfiguration_UpdateConfFile_BackupDaemon(t *testing.T) {
confFile := _createTestConfFile()
_ = os.Setenv("BACKUP_DAEMON", "something")
_ = os.Setenv("CUSTOM_JAVA_DAEMON_OPTS", "-Xmx4000m -Xms4000m")
err := updateConfFile(confFile)
assert.NoError(t, err)
updatedContent := _readLinesFromFile(confFile)
assert.Equal(t, updatedContent[7], "JAVA_DAEMON_OPTS=\"${JAVA_DAEMON_OPTS} -Xmx4000m -Xms4000m\"")
}
func TestEditMmsConfiguration_UpdatePropertiesFile(t *testing.T) {
val := fmt.Sprintf("test%d", rand.Intn(1000))
key := "OM_PROP_test_edit_mms_configuration_get_om_props"
_ = os.Setenv(key, val)
props := getOmPropertiesFromEnvVars()
assert.Equal(t, props["test.edit.mms.configuration.get.om.props"], val)
_ = os.Unsetenv(key)
}
func TestEditMmsConfiguration_GetOmPropertiesFromEnvVars(t *testing.T) {
_ = os.Setenv("OM_PROP_mms_test_prop", "somethingNew")
_ = os.Setenv("OM_PROP_mms_test_prop_new", "400")
propFile := _createTestPropertiesFile()
err := updatePropertiesFile(propFile)
assert.NoError(t, err)
updatedContent := _readLinesFromFile(propFile)
assert.Equal(t, updatedContent[0], "mms.prop=1234")
assert.Equal(t, updatedContent[1], "mms.test.prop5=")
assert.Equal(t, updatedContent[2], "mms.test.prop=somethingNew")
assert.Equal(t, updatedContent[3], "mms.test.prop.new=400")
}
func _createTestConfFile() string {
contents := "JAVA_MMS_UI_OPTS=\"${JAVA_MMS_UI_OPTS} -Xmx4352m -Xss328k -Xms4352m -XX:NewSize=600m -Xmn1500m -XX:ReservedCodeCacheSize=128m -XX:-OmitStackTraceInFastThrow\"\n"
contents += "JAVA_DAEMON_OPTS= \"${JAVA_DAEMON_OPTS} -DMONGO.BIN.PREFIX=\"\n\n"
return _writeTempFileWithContent(contents, "conf")
}
func _createTestPropertiesFile() string {
contents := "mms.prop=1234\nmms.test.prop5=\nmms.test.prop=something"
return _writeTempFileWithContent(contents, "prop")
}
func _readLinesFromFile(name string) []string {
content, _ := ioutil.ReadFile(name)
return strings.Split(string(content), "\n")
}
func _writeTempFileWithContent(content string, prefix string) string {
tmpfile, _ := ioutil.TempFile("", prefix)
_, _ = tmpfile.WriteString(content)
_ = tmpfile.Close()
return tmpfile.Name()
}
  • Pipeline Status: SUCCESS
    Branch: development

    graph LR
      0([setup]):::INTERNAL_SUCCESS --> 1([Import Artifacts]):::SUCCESS --> 2((/)):::INTERNAL_SUCCESS --> 3([Stage Artifacts]):::SUCCESS --> 4((/)):::INTERNAL_SUCCESS --> 5([Build]):::SUCCESS --> 6([Publish, Scan & Report]):::INTERNAL_NOT_BUILT
    
    classDef SUCCESS font-size:10px
    classDef FAILURE fill:#f44, font-size:10px
    classDef SKIPPED font-size:10px
    classDef ABORTED fill:#889, font-size:10px
    classDef INTERNAL_SUCCESS font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_FAILURE fill:#f44, font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_SKIPPED font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_ABORTED fill:#889, font-size:10px, stroke-dasharray: 2, 1
    
  • Pipeline Status: SUCCESS
    Branch: development

    graph LR
      0([setup]):::INTERNAL_SUCCESS --> 3([Import Artifacts]):::SUCCESS --> 4((/)):::INTERNAL_SUCCESS --> 5([Stage Artifacts]):::SUCCESS --> 6((/)):::INTERNAL_SUCCESS --> 7([Build]):::SUCCESS --> 8([Publish, Scan & Report]):::INTERNAL_NOT_BUILT
    
    classDef SUCCESS font-size:10px
    classDef FAILURE fill:#f44, font-size:10px
    classDef SKIPPED font-size:10px
    classDef ABORTED fill:#889, font-size:10px
    classDef INTERNAL_SUCCESS font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_FAILURE fill:#f44, font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_SKIPPED font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_ABORTED fill:#889, font-size:10px, stroke-dasharray: 2, 1
    
  • Pipeline Status: SUCCESS
    Branch: development

    graph LR
      0([setup]):::INTERNAL_SUCCESS --> 3([Import Artifacts]):::SUCCESS --> 4((/)):::INTERNAL_SUCCESS --> 5([Stage Artifacts]):::SUCCESS --> 6((/)):::INTERNAL_SUCCESS --> 7([Build]):::SUCCESS --> 8([Publish, Scan & Report]):::INTERNAL_NOT_BUILT
    
    classDef SUCCESS font-size:10px
    classDef FAILURE fill:#f44, font-size:10px
    classDef SKIPPED font-size:10px
    classDef ABORTED fill:#889, font-size:10px
    classDef INTERNAL_SUCCESS font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_FAILURE fill:#f44, font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_SKIPPED font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_ABORTED fill:#889, font-size:10px, stroke-dasharray: 2, 1
    
  • Pipeline Status: SUCCESS
    Branch: development

    graph LR
      0([setup]):::INTERNAL_SUCCESS --> 3([Import Artifacts]):::SUCCESS --> 4((/)):::INTERNAL_SUCCESS --> 5([Stage Artifacts]):::SUCCESS --> 6((/)):::INTERNAL_SUCCESS --> 7([Build]):::SUCCESS --> 8([Publish, Scan & Report]):::INTERNAL_NOT_BUILT
    
    classDef SUCCESS font-size:10px
    classDef FAILURE fill:#f44, font-size:10px
    classDef SKIPPED font-size:10px
    classDef ABORTED fill:#889, font-size:10px
    classDef INTERNAL_SUCCESS font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_FAILURE fill:#f44, font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_SKIPPED font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_ABORTED fill:#889, font-size:10px, stroke-dasharray: 2, 1
    
  • Pipeline Status: FAILURE
    FAILURE Stage: Twistlock Scan
    Branch: development

    graph LR
      0([setup]):::INTERNAL_SUCCESS --> 3([Import Artifacts]):::SUCCESS --> 4((/)):::INTERNAL_SUCCESS --> 5([Stage Artifacts]):::SUCCESS --> 6((/)):::INTERNAL_SUCCESS --> 7([Build]):::SUCCESS --> 8([Publish, Scan & Report]):::INTERNAL_FAILURE
    
    classDef SUCCESS font-size:10px
    classDef FAILURE fill:#f44, font-size:10px
    classDef SKIPPED font-size:10px
    classDef ABORTED fill:#889, font-size:10px
    classDef INTERNAL_SUCCESS font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_FAILURE fill:#f44, font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_SKIPPED font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_ABORTED fill:#889, font-size:10px, stroke-dasharray: 2, 1
    
  • Pipeline Status: SUCCESS
    Branch: development

    graph LR
      0([setup]):::INTERNAL_SUCCESS --> 3([Import Artifacts]):::SUCCESS --> 4((/)):::INTERNAL_SUCCESS --> 5([Stage Artifacts]):::SUCCESS --> 6((/)):::INTERNAL_SUCCESS --> 7([Build]):::SUCCESS --> 8([Publish, Scan & Report]):::INTERNAL_NOT_BUILT
    
    classDef SUCCESS font-size:10px
    classDef FAILURE fill:#f44, font-size:10px
    classDef SKIPPED font-size:10px
    classDef ABORTED fill:#889, font-size:10px
    classDef INTERNAL_SUCCESS font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_FAILURE fill:#f44, font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_SKIPPED font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_ABORTED fill:#889, font-size:10px, stroke-dasharray: 2, 1
    
  • Pipeline Status: SUCCESS
    Branch: development

    graph LR
      0([setup]):::INTERNAL_SUCCESS --> 3([Import Artifacts]):::SUCCESS --> 4((/)):::INTERNAL_SUCCESS --> 5([Stage Artifacts]):::SUCCESS --> 6((/)):::INTERNAL_SUCCESS --> 7([Build]):::SUCCESS --> 8([Publish, Scan & Report]):::INTERNAL_NOT_BUILT
    
    classDef SUCCESS font-size:10px
    classDef FAILURE fill:#f44, font-size:10px
    classDef SKIPPED font-size:10px
    classDef ABORTED fill:#889, font-size:10px
    classDef INTERNAL_SUCCESS font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_FAILURE fill:#f44, font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_SKIPPED font-size:10px, stroke-dasharray: 2, 1
    classDef INTERNAL_ABORTED fill:#889, font-size:10px, stroke-dasharray: 2, 1
    
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment