Skip to content

Commit

Permalink
Merge pull request #8 from containerum/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
MargoTuleninova authored Sep 3, 2018
2 parents 6b904d2 + 4f360e0 commit bf18cc4
Show file tree
Hide file tree
Showing 66 changed files with 7,701 additions and 133 deletions.
7 changes: 3 additions & 4 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ variables:
NAMESPACE: hosting
SECRET: gitlab-registry
REPOSITORY: ${CI_REGISTRY}/${CI_PROJECT_PATH}
PROJECT: mail

.docker-login: &docker-login
before_script:
Expand Down Expand Up @@ -61,9 +62,7 @@ dev-release:
- develop

dev-deploy:
image:
name: lachlanevenson/k8s-helm:v2.9.1
entrypoint: ["/bin/sh", "-c"]
image: exon/helm
stage: deploy
tags:
- develop
Expand All @@ -76,7 +75,7 @@ dev-deploy:
name: develop
script:
- cd charts/mail
- helm upgrade --install --debug --namespace=${NAMESPACE} ${CI_PROJECT_NAME} --set image.tag=${CI_COMMIT_SHA:0:8} --set image.secret=${SECRET} --set image.repository=${REPOSITORY} --set service.externalIP=192.168.88.210 --set env.local.CH_MAIL_SMTP_PASSWORD=${SMTP_PASSWORD} --set persistence.annotations."volume\.beta\.kubernetes\.io/storage-class"="gluster-heketi" --values values.yaml .
- helm upgrade --install --debug --namespace=${NAMESPACE} ${PROJECT} --set image.tag=${CI_COMMIT_SHA:0:8} --set image.secret=${SECRET} --set image.repository=${REPOSITORY} --set service.externalIP=88.99.247.59 --set env.local.CH_MAIL_SMTP_PASSWORD=${SMTP_PASSWORD} --set persistence.annotations."volume\.beta\.kubernetes\.io/storage-class"="default" --values values.yaml .
only:
- develop

Expand Down
12 changes: 6 additions & 6 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
FROM golang:1.10-alpine as builder
FROM golang:1.11-alpine as builder
RUN apk add --update make git
WORKDIR src/git.containerum.net/ch/mail-templater
COPY . .
RUN VERSION=$(git describe --abbrev=0 --tags) make build-for-docker
COPY templates.db /tmp/templates.db

FROM alpine:3.7
FROM alpine:3.8
RUN apk --no-cache add ca-certificates

VOLUME ["/storage"]

# app
COPY --from=builder /tmp/mail-templater /
COPY --from=builder /tmp/templates.db /storage/
COPY --from=builder /tmp/mail /
COPY templates.json /

# timezone data
ENV GIN_MODE=debug \
CH_MAIL_LOG_LEVEL=4 \
CH_MAIL_TEMPLATE_DB="/storage/templates.db" \
CH_MAIL_MESSAGES_DB="/storage/messages.db" \
CH_MAIL_DEFAULT_TEMPLATES="templates.json" \
CH_MAIL_UPSTREAM=smtp \
CH_MAIL_UPSTREAM_SIMPLE=smtp \
CH_MAIL_SENDER_NAME_SIMPLE=containerum \
Expand All @@ -33,4 +33,4 @@ ENV GIN_MODE=debug \

EXPOSE 7070

ENTRYPOINT ["/mail-templater"]
ENTRYPOINT ["/mail"]
24 changes: 12 additions & 12 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
version = "1.1.2"

[[constraint]]
branch = "master"
version = "1.0.0"
name = "github.com/google/uuid"

[[constraint]]
Expand All @@ -53,7 +53,7 @@

[[constraint]]
name = "gopkg.in/resty.v1"
version = "1.6"
version = "1.9.0"

[[constraint]]
version = "^v1.0.1-rc2"
Expand Down
10 changes: 5 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
.PHONY: build test clean release single_release
.PHONY: build build-for-docker test clean release single_release

CMD_DIR:=cmd/mail-templater

# make directory and store path to variable
BUILDS_DIR:=$(PWD)/build
EXECUTABLE:=mail-templater
EXECUTABLE:=mail
LDFLAGS=-X 'main.version=$(VERSION)' -w -s -extldflags '-static'

# go has build artifacts caching so soruce tracking not needed
build:
@echo "Building mail-templater for current OS/architecture"
@echo $(LDFLAGS)
@CGO_ENABLED=0 go build -v -ldflags="$(LDFLAGS)" -o $(BUILDS_DIR)/$(EXECUTABLE) ./$(CMD_DIR)
@CGO_ENABLED=0 go build -v -ldflags="$(LDFLAGS)" -tags="jsoniter" -o $(BUILDS_DIR)/$(EXECUTABLE) ./$(CMD_DIR)

build-for-docker:
@echo $(LDFLAGS)
@CGO_ENABLED=0 go build -v -ldflags="$(LDFLAGS)" -o /tmp/mail-templater ./$(CMD_DIR)
@CGO_ENABLED=0 go build -v -ldflags="$(LDFLAGS)" -tags="jsoniter" -o /tmp/$(EXECUTABLE) ./$(CMD_DIR)

test:
@echo "Running tests"
Expand Down Expand Up @@ -65,4 +65,4 @@ single_release:

dev:
@echo building $(VERSION)
go build -v --tags="dev" --ldflags="$(LDFLAGS)" ./$(CMD_DIR)
go build -v --tags="dev" --ldflags="$(LDFLAGS)" ./$(CMD_DIR)
73 changes: 58 additions & 15 deletions cmd/mail-templater/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,19 @@ package main
import (
"errors"

"io/ioutil"

"strings"

"git.containerum.net/ch/mail-templater/pkg/clients"
"git.containerum.net/ch/mail-templater/pkg/models"
"git.containerum.net/ch/mail-templater/pkg/mterrors"
"git.containerum.net/ch/mail-templater/pkg/storages"
"git.containerum.net/ch/mail-templater/pkg/storages/bolt"
"git.containerum.net/ch/mail-templater/pkg/upstreams"
"github.com/containerum/cherry"
"github.com/gin-gonic/gin"
"github.com/json-iterator/go"
"github.com/sirupsen/logrus"
"github.com/urfave/cli"
"gopkg.in/mailgun/mailgun-go.v1"
Expand All @@ -33,6 +41,7 @@ const (
smtpLoginFlag = "smtp_login"
smtpPasswordFlag = "smtp_password"
corsFlag = "cors"
defaultTemplatesFlag = "default_templates"
)

var flags = []cli.Flag{
Expand Down Expand Up @@ -140,6 +149,12 @@ var flags = []cli.Flag{
Name: corsFlag,
Usage: "enable CORS",
},
cli.StringFlag{
EnvVar: "CH_MAIL_DEFAULT_TEMPLATES",
Name: defaultTemplatesFlag,
Value: "templates.json",
Usage: "json file with default templates",
},
}

func setupLogs(c *cli.Context) {
Expand Down Expand Up @@ -176,43 +191,40 @@ func getMessagesStorage(c *cli.Context) (storages.MessagesStorage, error) {
}
}

func getUpstream(c *cli.Context, msgStorage storages.MessagesStorage) (upstreams.Upstream, bool, error) {
func getUpstream(c *cli.Context, msgStorage storages.MessagesStorage) (upstreams.Upstream, error) {
switch c.String(upstreamFlag) {
case "mailgun":
mg, err := mailgun.NewMailgunFromEnv()
if err != nil {
return nil, true, err
return nil, err
}
return upstreams.NewMailgun(mg, msgStorage, c.String(senderNameFlag), c.String(senderMailFlag)), err == nil, nil
return upstreams.NewMailgun(mg, msgStorage, c.String(senderNameFlag), c.String(senderMailFlag)), nil
case "smtp":
upstream := upstreams.NewSMTPUpstream(msgStorage, c.String(senderNameFlag), c.String(senderMailFlag), c.String(smtpAddrFlag), c.String(smtpLoginFlag), c.String(smtpPasswordFlag))
return upstream, true, nil
return upstream, nil
case "dummy":
return upstreams.NewDummyUpstream(), true, nil
return upstreams.NewDummyUpstream(), nil
default:
return nil, true, errors.New("invalid upstream")
return nil, errors.New("invalid upstream")
}
}

func getUpstreamSimple(c *cli.Context, msgStorage storages.MessagesStorage) (upstreams.Upstream, bool, error) {
func getUpstreamSimple(c *cli.Context, msgStorage storages.MessagesStorage) (upstreams.Upstream, error) {
switch c.String(upstreamSimpleFlag) {
case "mailgun":
mg, err := mailgun.NewMailgunFromEnv()
if err != nil {
return nil, false, err
return nil, err
}
return upstreams.NewMailgun(mg, msgStorage, c.String(senderNameSimpleFlag), c.String(senderMailSimpleFlag)), err == nil, nil
return upstreams.NewMailgun(mg, msgStorage, c.String(senderNameSimpleFlag), c.String(senderMailSimpleFlag)), nil
case "smtp":
upstream := upstreams.NewSMTPUpstream(msgStorage, c.String(senderNameSimpleFlag), c.String(senderMailSimpleFlag), c.String(smtpAddrFlag), c.String(smtpLoginFlag), c.String(smtpPasswordFlag))
err := upstream.CheckStatus()
if err!=nil {
logrus.Errorf("SMTP Check failed: %v", err)
}
return upstream, err == nil, nil
return upstream, err
case "dummy":
return upstreams.NewDummyUpstream(), true, nil
return upstreams.NewDummyUpstream(), nil
default:
return nil, true, errors.New("invalid upstream")
return nil, errors.New("invalid upstream")
}
}

Expand All @@ -224,3 +236,34 @@ func getUserManagerClient(c *cli.Context) (clients.UserManagerClient, error) {
return nil, errors.New("invalid user manager client")
}
}

func importDefaultTemplates(c *cli.Context, tstorage storages.TemplateStorage) error {
file, err := ioutil.ReadFile(c.String(defaultTemplatesFlag))
if err != nil {
return err
}
var defTemplates []models.Template
if err := jsoniter.Unmarshal(file, &defTemplates); err != nil {
return err
}
var tmplErrs []string
for _, tmpl := range defTemplates {
if err := tstorage.PutTemplate(tmpl.Name, tmpl.Version, tmpl.Data, tmpl.Subject, true); err != nil {
//If template with this name already exists it's not a problem
if !cherry.Equals(err, mterrors.ErrTemplateAlreadyExists()) {
logrus.
WithField("name", tmpl.Name).
WithField("version", tmpl.Version).
WithError(err).
Warn("Unable to import template")

tmplErrs = append(tmplErrs, err.Error())
}
}
}
logrus.Println("Templates import finished")
if len(tmplErrs) != 0 {
return errors.New(strings.Join(tmplErrs, "; "))
}
return nil
}
2 changes: 1 addition & 1 deletion cmd/mail-templater/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ var version string

func main() {
app := cli.NewApp()
app.Name = "mail-templater"
app.Name = "mail"
app.Version = version
app.Usage = "service for making and sending emails"
app.Flags = flags
Expand Down
31 changes: 21 additions & 10 deletions cmd/mail-templater/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,35 @@ func initServer(c *cli.Context) error {

setupLogs(c)

status := &model.ServiceStatus{
Name: c.App.Name,
Version: c.App.Version,
StatusOK: true,
Details: map[string]string{},
}

ts, err := getTemplatesStorage(c)
exitOnErr(err)
defer ts.Close()
ms, err := getMessagesStorage(c)
exitOnErr(err)
defer ms.Close()
us, _, err := getUpstream(c, ms)
exitOnErr(err)
uss, usActive, err := getUpstreamSimple(c, ms)
us, err := getUpstream(c, ms)
exitOnErr(err)

uss, userr := getUpstreamSimple(c, ms)
if userr != nil {
logrus.WithError(userr).Warn("simple upstream not ready")
status.AddDetails("SimpleUpstreamNotReady", userr.Error())
status.StatusOK = false
}

um, err := getUserManagerClient(c)
exitOnErr(err)

status := model.ServiceStatus{
Name: c.App.Name,
Version: c.App.Version,
StatusOK: true,
if err := importDefaultTemplates(c, ts); err != nil {
logrus.WithError(err).Warn("unable to import default templates")
status.AddDetails("UnableImportTemplates", err.Error())
}

app := router.CreateRouter(&middleware.Services{
Expand All @@ -51,11 +63,10 @@ func initServer(c *cli.Context) error {
Upstream: us,
UpstreamSimple: uss,
UserManagerClient: um,
Active: usActive,
}, &status, c.Bool(corsFlag))
Active: userr == nil,
}, status, c.Bool(corsFlag))

// graceful shutdown support

srv := http.Server{
Addr: ":" + c.String(portFlag),
Handler: app,
Expand Down
Loading

0 comments on commit bf18cc4

Please sign in to comment.