create_service.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /*
  2. Copyright 2016 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package cmd
  14. import (
  15. "fmt"
  16. "io"
  17. "github.com/renstrom/dedent"
  18. "github.com/spf13/cobra"
  19. "k8s.io/kubernetes/pkg/api"
  20. "k8s.io/kubernetes/pkg/kubectl"
  21. cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
  22. )
  23. // NewCmdCreateService is a macro command to create a new namespace
  24. func NewCmdCreateService(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command {
  25. cmd := &cobra.Command{
  26. Use: "service",
  27. Short: "Create a service using specified subcommand.",
  28. Long: "Create a service using specified subcommand.",
  29. Run: func(cmd *cobra.Command, args []string) {
  30. cmd.Help()
  31. },
  32. }
  33. cmd.AddCommand(NewCmdCreateServiceClusterIP(f, cmdOut))
  34. cmd.AddCommand(NewCmdCreateServiceNodePort(f, cmdOut))
  35. cmd.AddCommand(NewCmdCreateServiceLoadBalancer(f, cmdOut))
  36. return cmd
  37. }
  38. var (
  39. serviceClusterIPLong = dedent.Dedent(`
  40. Create a clusterIP service with the specified name.`)
  41. serviceClusterIPExample = dedent.Dedent(`
  42. # Create a new clusterIP service named my-cs
  43. kubectl create service clusterip my-cs --tcp=5678:8080
  44. # Create a new clusterIP service named my-cs (in headless mode)
  45. kubectl create service clusterip my-cs --clusterip="None"`)
  46. )
  47. func addPortFlags(cmd *cobra.Command) {
  48. cmd.Flags().StringSlice("tcp", []string{}, "Port pairs can be specified as '<port>:<targetPort>'.")
  49. }
  50. // NewCmdCreateServiceClusterIP is a command to create generic secrets from files, directories, or literal values
  51. func NewCmdCreateServiceClusterIP(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command {
  52. cmd := &cobra.Command{
  53. Use: "clusterip NAME [--tcp=<port>:<targetPort>] [--dry-run]",
  54. Short: "Create a clusterIP service.",
  55. Long: serviceClusterIPLong,
  56. Example: serviceClusterIPExample,
  57. Run: func(cmd *cobra.Command, args []string) {
  58. err := CreateServiceClusterIP(f, cmdOut, cmd, args)
  59. cmdutil.CheckErr(err)
  60. },
  61. }
  62. cmdutil.AddApplyAnnotationFlags(cmd)
  63. cmdutil.AddValidateFlags(cmd)
  64. cmdutil.AddPrinterFlags(cmd)
  65. cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceClusterIPGeneratorV1Name)
  66. addPortFlags(cmd)
  67. cmd.Flags().String("clusterip", "", "Assign your own ClusterIP or set to 'None' for a 'headless' service (no loadbalancing).")
  68. return cmd
  69. }
  70. // CreateServiceClusterIP implements the behavior to run the create namespace command
  71. func CreateServiceClusterIP(f *cmdutil.Factory, cmdOut io.Writer, cmd *cobra.Command, args []string) error {
  72. name, err := NameFromCommandArgs(cmd, args)
  73. if err != nil {
  74. return err
  75. }
  76. var generator kubectl.StructuredGenerator
  77. switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName {
  78. case cmdutil.ServiceClusterIPGeneratorV1Name:
  79. generator = &kubectl.ServiceCommonGeneratorV1{
  80. Name: name,
  81. TCP: cmdutil.GetFlagStringSlice(cmd, "tcp"),
  82. Type: api.ServiceTypeClusterIP,
  83. ClusterIP: cmdutil.GetFlagString(cmd, "clusterip"),
  84. }
  85. default:
  86. return cmdutil.UsageError(cmd, fmt.Sprintf("Generator: %s not supported.", generatorName))
  87. }
  88. return RunCreateSubcommand(f, cmd, cmdOut, &CreateSubcommandOptions{
  89. Name: name,
  90. StructuredGenerator: generator,
  91. DryRun: cmdutil.GetDryRunFlag(cmd),
  92. OutputFormat: cmdutil.GetFlagString(cmd, "output"),
  93. })
  94. }
  95. var (
  96. serviceNodePortLong = dedent.Dedent(`
  97. Create a nodeport service with the specified name.`)
  98. serviceNodePortExample = dedent.Dedent(`
  99. # Create a new nodeport service named my-ns
  100. kubectl create service nodeport my-ns --tcp=5678:8080`)
  101. )
  102. // NewCmdCreateServiceNodePort is a macro command for creating secrets to work with Docker registries
  103. func NewCmdCreateServiceNodePort(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command {
  104. cmd := &cobra.Command{
  105. Use: "nodeport NAME [--tcp=port:targetPort] [--dry-run]",
  106. Short: "Create a NodePort service.",
  107. Long: serviceNodePortLong,
  108. Example: serviceNodePortExample,
  109. Run: func(cmd *cobra.Command, args []string) {
  110. err := CreateServiceNodePort(f, cmdOut, cmd, args)
  111. cmdutil.CheckErr(err)
  112. },
  113. }
  114. cmdutil.AddApplyAnnotationFlags(cmd)
  115. cmdutil.AddValidateFlags(cmd)
  116. cmdutil.AddPrinterFlags(cmd)
  117. cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceNodePortGeneratorV1Name)
  118. addPortFlags(cmd)
  119. return cmd
  120. }
  121. // CreateServiceNodePort is the implementation of the create secret docker-registry command
  122. func CreateServiceNodePort(f *cmdutil.Factory, cmdOut io.Writer, cmd *cobra.Command, args []string) error {
  123. name, err := NameFromCommandArgs(cmd, args)
  124. if err != nil {
  125. return err
  126. }
  127. var generator kubectl.StructuredGenerator
  128. switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName {
  129. case cmdutil.ServiceNodePortGeneratorV1Name:
  130. generator = &kubectl.ServiceCommonGeneratorV1{
  131. Name: name,
  132. TCP: cmdutil.GetFlagStringSlice(cmd, "tcp"),
  133. Type: api.ServiceTypeNodePort,
  134. ClusterIP: "",
  135. }
  136. default:
  137. return cmdutil.UsageError(cmd, fmt.Sprintf("Generator: %s not supported.", generatorName))
  138. }
  139. return RunCreateSubcommand(f, cmd, cmdOut, &CreateSubcommandOptions{
  140. Name: name,
  141. StructuredGenerator: generator,
  142. DryRun: cmdutil.GetDryRunFlag(cmd),
  143. OutputFormat: cmdutil.GetFlagString(cmd, "output"),
  144. })
  145. }
  146. var (
  147. serviceLoadBalancerLong = dedent.Dedent(`
  148. Create a LoadBalancer service with the specified name.`)
  149. serviceLoadBalancerExample = dedent.Dedent(`
  150. # Create a new nodeport service named my-lbs
  151. kubectl create service loadbalancer my-lbs --tcp=5678:8080`)
  152. )
  153. // NewCmdCreateServiceLoadBalancer is a macro command for creating secrets to work with Docker registries
  154. func NewCmdCreateServiceLoadBalancer(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command {
  155. cmd := &cobra.Command{
  156. Use: "loadbalancer NAME [--tcp=port:targetPort] [--dry-run]",
  157. Short: "Create a LoadBalancer service.",
  158. Long: serviceLoadBalancerLong,
  159. Example: serviceLoadBalancerExample,
  160. Run: func(cmd *cobra.Command, args []string) {
  161. err := CreateServiceLoadBalancer(f, cmdOut, cmd, args)
  162. cmdutil.CheckErr(err)
  163. },
  164. }
  165. cmdutil.AddApplyAnnotationFlags(cmd)
  166. cmdutil.AddValidateFlags(cmd)
  167. cmdutil.AddPrinterFlags(cmd)
  168. cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceLoadBalancerGeneratorV1Name)
  169. addPortFlags(cmd)
  170. return cmd
  171. }
  172. // CreateServiceLoadBalancer is the implementation of the create secret tls command
  173. func CreateServiceLoadBalancer(f *cmdutil.Factory, cmdOut io.Writer, cmd *cobra.Command, args []string) error {
  174. name, err := NameFromCommandArgs(cmd, args)
  175. if err != nil {
  176. return err
  177. }
  178. var generator kubectl.StructuredGenerator
  179. switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName {
  180. case cmdutil.ServiceLoadBalancerGeneratorV1Name:
  181. generator = &kubectl.ServiceCommonGeneratorV1{
  182. Name: name,
  183. TCP: cmdutil.GetFlagStringSlice(cmd, "tcp"),
  184. Type: api.ServiceTypeLoadBalancer,
  185. ClusterIP: "",
  186. }
  187. default:
  188. return cmdutil.UsageError(cmd, fmt.Sprintf("Generator: %s not supported.", generatorName))
  189. }
  190. return RunCreateSubcommand(f, cmd, cmdOut, &CreateSubcommandOptions{
  191. Name: name,
  192. StructuredGenerator: generator,
  193. DryRun: cmdutil.GetFlagBool(cmd, "dry-run"),
  194. OutputFormat: cmdutil.GetFlagString(cmd, "output"),
  195. })
  196. }