blob: 250ed46aecd6c2f2b1b9fdcfbec0e368b1baf0c6 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package cmd
import (
"context"
"fmt"
"cloud.google.com/go/pubsub"
"github.com/maruel/subcommands"
"go.chromium.org/luci/common/cli"
"go.chromium.org/luci/common/errors"
)
type setupRun struct {
baseRun
name string
}
// CmdSetup describes the subcommand flags for setting up a subscription
var CmdSetup = &subcommands.Command{
UsageLine: "setup -project [PROJECT] -topic [TOPIC] -name [NAME]",
ShortDesc: "set up a subscription",
CommandRun: func() subcommands.CommandRun {
c := &setupRun{}
c.registerCommonFlags(&c.Flags)
c.Flags.StringVar(&c.name, "name", "", "name of subscription: must be 3-255 characters, start with a letter, and composed of alphanumerics and -_.~+% only")
return c
},
}
func (c *setupRun) validateArgs(ctx context.Context, a subcommands.Application, args []string, env subcommands.Env) error {
if c.topic == "" {
return errors.Reason("topic name is required").Err()
}
if c.name == "" {
return errors.Reason("subscription name is required").Err()
}
return nil
}
func (c *setupRun) Run(a subcommands.Application, args []string, env subcommands.Env) int {
err := c.innerRun(a, args, env)
if err != nil {
fmt.Fprintln(a.GetErr(), err.Error())
return 1
}
fmt.Fprintf(a.GetErr(), "Created subscription %s", c.name)
return 0
}
func (c *setupRun) innerRun(a subcommands.Application, args []string, env subcommands.Env) error {
ctx := cli.GetContext(a, c, env)
if err := c.validateArgs(ctx, a, args, env); err != nil {
c.Flags.Usage()
return err
}
client, err := pubsub.NewClient(ctx, c.project)
if err != nil {
return err
}
topic, err := client.CreateTopic(ctx, c.topic)
if err != nil {
return err
}
cfg := pubsub.SubscriptionConfig{Topic: topic}
_, err = client.CreateSubscription(ctx, c.name, cfg)
if err != nil {
return err
}
return nil
}