github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+incompatible/cf/commands/securitygroup/create_security_group.go (about)

     1  package securitygroup
     2  
     3  import (
     4  	"strings"
     5  
     6  	. "github.com/cloudfoundry/cli/cf/i18n"
     7  
     8  	"github.com/cloudfoundry/cli/cf/api/security_groups"
     9  	"github.com/cloudfoundry/cli/cf/command_metadata"
    10  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
    11  	"github.com/cloudfoundry/cli/cf/errors"
    12  	"github.com/cloudfoundry/cli/cf/requirements"
    13  	"github.com/cloudfoundry/cli/cf/terminal"
    14  	"github.com/cloudfoundry/cli/json"
    15  	"github.com/codegangsta/cli"
    16  )
    17  
    18  type CreateSecurityGroup struct {
    19  	ui                terminal.UI
    20  	securityGroupRepo security_groups.SecurityGroupRepo
    21  	configRepo        core_config.Reader
    22  }
    23  
    24  func NewCreateSecurityGroup(ui terminal.UI, configRepo core_config.Reader, securityGroupRepo security_groups.SecurityGroupRepo) CreateSecurityGroup {
    25  	return CreateSecurityGroup{
    26  		ui:                ui,
    27  		configRepo:        configRepo,
    28  		securityGroupRepo: securityGroupRepo,
    29  	}
    30  }
    31  
    32  func (cmd CreateSecurityGroup) Metadata() command_metadata.CommandMetadata {
    33  	primaryUsage := T("CF_NAME create-security-group SECURITY_GROUP PATH_TO_JSON_RULES_FILE")
    34  	secondaryUsage := T(`   The provided path can be an absolute or relative path to a file.  The file should have
    35     a single array with JSON objects inside describing the rules.  The JSON Base Object is 
    36     omitted and only the square brackets and associated child object are required in the file.  
    37  
    38     Valid json file example:
    39     [
    40       {
    41         "protocol": "tcp",
    42         "destination": "10.244.1.18",
    43         "ports": "3306"
    44       }
    45     ]`)
    46  
    47  	return command_metadata.CommandMetadata{
    48  		Name:        "create-security-group",
    49  		Description: T("Create a security group"),
    50  		Usage:       strings.Join([]string{primaryUsage, secondaryUsage}, "\n\n"),
    51  	}
    52  }
    53  
    54  func (cmd CreateSecurityGroup) GetRequirements(requirementsFactory requirements.Factory, context *cli.Context) ([]requirements.Requirement, error) {
    55  	if len(context.Args()) != 2 {
    56  		cmd.ui.FailWithUsage(context)
    57  	}
    58  
    59  	requirements := []requirements.Requirement{requirementsFactory.NewLoginRequirement()}
    60  	return requirements, nil
    61  }
    62  
    63  func (cmd CreateSecurityGroup) Run(context *cli.Context) {
    64  	name := context.Args()[0]
    65  	pathToJSONFile := context.Args()[1]
    66  	rules, err := json.ParseJSON(pathToJSONFile)
    67  	if err != nil {
    68  		cmd.ui.Failed(T(`Incorrect json format: file: {{.JSONFile}}
    69  		
    70  Valid json file example:
    71  [
    72    {
    73      "protocol": "tcp",
    74      "destination": "10.244.1.18",
    75      "ports": "3306"
    76    }
    77  ]`, map[string]interface{}{"JSONFile": pathToJSONFile}))
    78  	}
    79  
    80  	cmd.ui.Say(T("Creating security group {{.security_group}} as {{.username}}",
    81  		map[string]interface{}{
    82  			"security_group": terminal.EntityNameColor(name),
    83  			"username":       terminal.EntityNameColor(cmd.configRepo.Username()),
    84  		}))
    85  
    86  	err = cmd.securityGroupRepo.Create(name, rules)
    87  
    88  	httpErr, ok := err.(errors.HttpError)
    89  	if ok && httpErr.ErrorCode() == errors.SECURITY_GROUP_EXISTS {
    90  		cmd.ui.Ok()
    91  		cmd.ui.Warn(T("Security group {{.security_group}} {{.error_message}}",
    92  			map[string]interface{}{
    93  				"security_group": terminal.EntityNameColor(name),
    94  				"error_message":  terminal.WarningColor(T("already exists")),
    95  			}))
    96  		return
    97  	}
    98  
    99  	if err != nil {
   100  		cmd.ui.Failed(err.Error())
   101  	}
   102  
   103  	cmd.ui.Ok()
   104  }