Skip to content

Commit c0188c0

Browse files
committed
feat: Add support for v1 projects flag.
1 parent 89f4117 commit c0188c0

3 files changed

Lines changed: 178 additions & 97 deletions

File tree

cmd/cloud_sql_proxy/cloud_sql_proxy.go

Lines changed: 88 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -760,47 +760,62 @@ use the value from the flag, Not compatible with -fuse.`,
760760
return 0
761761
}
762762

763+
type TranslationResult struct {
764+
V2Args []string
765+
LogDebugStdout bool
766+
Verbose bool
767+
Unsupported []string
768+
LegacySet bool
769+
V2Compat bool
770+
V2Mode bool
771+
Projects []string
772+
OK bool
773+
}
774+
763775
func main() {
764-
translatedArgs, logDebugStdout, verbose, unsupported, legacySet, v2Compat, v2Mode, ok := translateV2Args()
776+
tr := translateV2Args()
765777

766-
if v2Mode {
778+
if tr.V2Mode {
767779
v2cmd := proxyv2cmd.NewCommand()
768-
v2cmd.SetArgs(translatedArgs)
780+
v2cmd.SetArgs(tr.V2Args)
769781
proxyv2cmd.ExecuteCommand(v2cmd)
770782
return
771783
}
772784

773-
if ok {
785+
if tr.OK {
774786
fmt.Fprintln(os.Stderr, "This proxy running Auth Proxy v2 in compatibility mode.")
775787
fmt.Fprintln(os.Stderr, "To use Proxy v1, add the -legacy-v1-proxy flag.")
776788

777789
opts := []proxyv2cmd.Option{
778790
proxyv2cmd.WithProxyV1Compatibility(),
779-
proxyv2cmd.WithProxyV1Verbose(verbose),
791+
proxyv2cmd.WithProxyV1Verbose(tr.Verbose),
780792
}
781-
if logDebugStdout {
793+
if tr.LogDebugStdout {
782794
opts = append(opts, proxyv2cmd.WithProxyV1LogDebugStdout())
783795
}
796+
if len(tr.Projects) > 0 {
797+
opts = append(opts, proxyv2cmd.WithProxyV1Projects(tr.Projects))
798+
}
784799

785800
v2cmd := proxyv2cmd.NewCommand(opts...)
786-
v2cmd.SetArgs(translatedArgs)
801+
v2cmd.SetArgs(tr.V2Args)
787802
proxyv2cmd.ExecuteCommand(v2cmd)
788803
return
789804
}
790805

791806
// Translation failed
792-
if v2Compat && len(unsupported) > 0 {
793-
fmt.Fprintf(os.Stderr, "Error: -v2-compat flag is set, but the following flags are not supported in v2 compatibility mode: %s\n", strings.Join(unsupported, ", "))
807+
if tr.V2Compat && len(tr.Unsupported) > 0 {
808+
fmt.Fprintf(os.Stderr, "Error: -v2-compat flag is set, but the following flags are not supported in v2 compatibility mode: %s\n", strings.Join(tr.Unsupported, ", "))
794809
os.Exit(1)
795810
}
796811

797812
fmt.Fprintln(os.Stderr, "This proxy is using Auth Proxy v1 legacy mode.")
798-
if legacySet {
813+
if tr.LegacySet {
799814
fmt.Fprintln(os.Stderr, "This proxy is using Auth Proxy v1 legacy mode because the -legacy-v1-proxy flag is set")
800-
} else if len(unsupported) > 0 {
815+
} else if len(tr.Unsupported) > 0 {
801816
fmt.Fprintln(os.Stderr, "This proxy is using Auth Proxy v1 legacy mode because it is using")
802817
fmt.Fprintln(os.Stderr, "flags that are not supported in v2 compatibility mode:")
803-
fmt.Fprintln(os.Stderr, strings.Join(unsupported, ", "))
818+
fmt.Fprintln(os.Stderr, strings.Join(tr.Unsupported, ", "))
804819
}
805820

806821
code := runProxy()
@@ -814,44 +829,36 @@ func main() {
814829
// If the arguments use a feature that is not supported in Proxy v2, this
815830
// returns false for OK, indicating that the legacy proxy v1 should run the
816831
// code.
817-
//
818-
// Returns:
819-
// - v2args the arguments translated for the v2 command
820-
// - logDebugStdout true if the v1 -log_debug_stdout flag was set
821-
// - verbose true if the v1 -verbose flag was set (default true)
822-
// - unsupported list of v1 flags that are not supported in v2
823-
// - legacySet true if -legacy-v1-proxy was set
824-
// - v2Compat true if -v2-compat was set
825-
// - v2Mode true if -v2 was set
826-
// - ok true when it is OK to use the v2 proxy command
827-
func translateV2Args() (v2args []string, logDebugStdout, verbose bool, unsupported []string, legacySet, v2Compat, v2Mode, ok bool) {
828-
verbose = true // default
832+
func translateV2Args() TranslationResult {
833+
var tr TranslationResult
834+
tr.Verbose = true // default
829835

830836
// Check for special flags before anything else
831837
for _, arg := range os.Args {
832838
if arg == "--legacy-v1-proxy" || arg == "-legacy-v1-proxy" {
833-
legacySet = true
839+
tr.LegacySet = true
834840
}
835841
if arg == "--v2-compat" || arg == "-v2-compat" {
836-
v2Compat = true
842+
tr.V2Compat = true
837843
}
838844
if arg == "--v2" || arg == "-v2" {
839-
v2Mode = true
845+
tr.V2Mode = true
840846
}
841847
}
842848

843-
if v2Mode {
849+
if tr.V2Mode {
844850
// In v2 mode, we just pass all arguments except -v2 to the v2 parser
845851
for _, arg := range os.Args[1:] {
846852
if arg != "--v2" && arg != "-v2" {
847-
v2args = append(v2args, arg)
853+
tr.V2Args = append(tr.V2Args, arg)
848854
}
849855
}
850-
return v2args, false, false, nil, false, false, true, true
856+
tr.OK = true
857+
return tr
851858
}
852859

853-
if legacySet {
854-
return nil, false, false, nil, true, v2Compat, false, false
860+
if tr.LegacySet {
861+
return tr
855862
}
856863

857864
fs := flag.NewFlagSet("translate", flag.ContinueOnError)
@@ -878,10 +885,10 @@ func translateV2Args() (v2args []string, logDebugStdout, verbose bool, unsupport
878885
verboseFlag := fs.Bool("verbose", true, "")
879886
logDebugStdoutFlag := fs.Bool("log_debug_stdout", false, "")
880887
instancesMetadata := fs.String("instances_metadata", "", "")
888+
projectsFlag := fs.String("projects", "", "")
881889

882890
// Untranslatable flags
883891
_ = fs.Bool("check_region", false, "")
884-
_ = fs.String("projects", "", "")
885892
_ = fs.Duration("refresh_config_throttle", 0, "")
886893
_ = fs.Uint64("fd_rlimit", 0, "")
887894
_ = fs.Bool("legacy-v1-proxy", false, "")
@@ -891,76 +898,82 @@ func translateV2Args() (v2args []string, logDebugStdout, verbose bool, unsupport
891898
fs.Var(&instances, "instances", "")
892899

893900
if err := fs.Parse(os.Args[1:]); err != nil {
894-
return nil, false, false, nil, false, v2Compat, false, false
901+
return tr
895902
}
896903

897904
// Check for unsupported flags being set
898905
fs.Visit(func(f *flag.Flag) {
899906
switch f.Name {
900-
case "check_region", "projects":
901-
unsupported = append(unsupported, "-"+f.Name)
907+
case "check_region":
908+
tr.Unsupported = append(tr.Unsupported, "-"+f.Name)
902909
}
903910
})
904-
if len(unsupported) > 0 {
905-
return nil, false, false, unsupported, false, v2Compat, false, false
911+
if len(tr.Unsupported) > 0 {
912+
return tr
906913
}
907914

908-
var args []string
909915
fs.Visit(func(f *flag.Flag) {
910916
switch f.Name {
917+
case "projects":
918+
if *projectsFlag != "" {
919+
tr.Projects = strings.Split(*projectsFlag, ",")
920+
}
911921
case "instances_metadata":
912-
args = append(args, "--instances-metadata", *instancesMetadata)
922+
tr.V2Args = append(tr.V2Args, "--instances-metadata", *instancesMetadata)
913923
case "credential_file":
914-
args = append(args, "--credentials-file", *credentialFile)
924+
tr.V2Args = append(tr.V2Args, "--credentials-file", *credentialFile)
915925
case "token":
916-
args = append(args, "--token", *token)
926+
tr.V2Args = append(tr.V2Args, "--token", *token)
917927
case "login_token":
918-
args = append(args, "--login-token", *loginToken)
928+
tr.V2Args = append(tr.V2Args, "--login-token", *loginToken)
919929
case "enable_iam_login":
920930
if *enableIAMLogin {
921-
args = append(args, "--auto-iam-authn")
931+
tr.V2Args = append(tr.V2Args, "--auto-iam-authn")
922932
}
923933
case "dir":
924-
args = append(args, "--unix-socket", *dir)
934+
tr.V2Args = append(tr.V2Args, "--unix-socket", *dir)
925935
case "fuse":
926936
if *useFuse {
927-
args = append(args, "--fuse", *dir)
937+
tr.V2Args = append(tr.V2Args, "--fuse", *dir)
928938
}
929939
case "fuse_tmp":
930-
args = append(args, "--fuse-temp-dir", *fuseTmp)
940+
tr.V2Args = append(tr.V2Args, "--fuse-temp-dir", *fuseTmp)
931941
case "health_check_port":
932-
args = append(args, "--http-port", *healthCheckPort)
942+
tr.V2Args = append(tr.V2Args, "--http-port", *healthCheckPort)
933943
case "use_http_health_check":
934944
if *useHTTPHealthCheck {
935-
args = append(args, "--health-check")
945+
tr.V2Args = append(tr.V2Args, "--health-check")
936946
}
937947
case "host":
938-
args = append(args, "--sqladmin-api-endpoint", *host)
948+
tr.V2Args = append(tr.V2Args, "--sqladmin-api-endpoint", *host)
939949
case "max_connections":
940-
args = append(args, "--max-connections", strconv.FormatUint(*maxConnections, 10))
950+
tr.V2Args = append(tr.V2Args, "--max-connections", strconv.FormatUint(*maxConnections, 10))
941951
case "quiet":
942952
if *quiet {
943-
args = append(args, "--quiet")
953+
tr.V2Args = append(tr.V2Args, "--quiet")
944954
}
945955
case "quota_project":
946-
args = append(args, "--quota-project", *quotaProject)
956+
tr.V2Args = append(tr.V2Args, "--quota-project", *quotaProject)
947957
case "skip_failed_instance_config":
948958
if *skipFailedInstanceConfig {
949-
args = append(args, "--skip-failed-instance-config")
959+
tr.V2Args = append(tr.V2Args, "--skip-failed-instance-config")
950960
}
951961
case "structured_logs":
952962
if *structuredLogs {
953-
args = append(args, "--structured-logs")
963+
tr.V2Args = append(tr.V2Args, "--structured-logs")
954964
}
955965
case "term_timeout":
956-
args = append(args, "--max-sigterm-delay", termTimeout.String())
966+
tr.V2Args = append(tr.V2Args, "--max-sigterm-delay", termTimeout.String())
957967
case "version":
958968
if *version {
959-
args = append(args, "--version")
969+
tr.V2Args = append(tr.V2Args, "--version")
960970
}
961971
}
962972
})
963973

974+
tr.LogDebugStdout = *logDebugStdoutFlag
975+
tr.Verbose = *verboseFlag
976+
964977
// ip_address_types handling
965978
ipTypesSet := false
966979
fs.Visit(func(f *flag.Flag) {
@@ -970,7 +983,7 @@ func translateV2Args() (v2args []string, logDebugStdout, verbose bool, unsupport
970983
})
971984

972985
if !ipTypesSet {
973-
args = append(args, "--auto-ip")
986+
tr.V2Args = append(tr.V2Args, "--auto-ip")
974987
} else {
975988
types := strings.Split(*ipAddressTypes, ",")
976989
hasPublic := false
@@ -983,13 +996,14 @@ func translateV2Args() (v2args []string, logDebugStdout, verbose bool, unsupport
983996
hasPrivate = true
984997
default:
985998
// Unknown type, fallback to v1
986-
return nil, false, false, []string{"-ip_address_types=" + *ipAddressTypes}, false, v2Compat, false, false
999+
tr.Unsupported = append(tr.Unsupported, "-ip_address_types="+*ipAddressTypes)
1000+
return tr
9871001
}
9881002
}
9891003
if hasPublic && hasPrivate {
990-
args = append(args, "--auto-ip")
1004+
tr.V2Args = append(tr.V2Args, "--auto-ip")
9911005
} else if hasPrivate {
992-
args = append(args, "--private-ip")
1006+
tr.V2Args = append(tr.V2Args, "--private-ip")
9931007
} else if hasPublic {
9941008
// default in v2 is public
9951009
}
@@ -1000,13 +1014,13 @@ func translateV2Args() (v2args []string, logDebugStdout, verbose bool, unsupport
10001014
parts := strings.SplitN(inst, "=", 2)
10011015
connName := parts[0]
10021016
if len(parts) == 1 {
1003-
args = append(args, connName)
1017+
tr.V2Args = append(tr.V2Args, connName)
10041018
continue
10051019
}
10061020

10071021
opts := strings.SplitN(parts[1], ":", 2)
10081022
if len(opts) != 2 {
1009-
return nil, false, false, nil, false, v2Compat, false, false // Invalid format
1023+
return tr // Invalid format
10101024
}
10111025

10121026
netType := opts[0]
@@ -1018,28 +1032,29 @@ func translateV2Args() (v2args []string, logDebugStdout, verbose bool, unsupport
10181032
// host:port
10191033
h, p, err := net.SplitHostPort(netAddr)
10201034
if err != nil {
1021-
return nil, false, false, nil, false, v2Compat, false, false
1035+
return tr
10221036
}
1023-
args = append(args, fmt.Sprintf("%s?address=%s&port=%s", connName, h, p))
1037+
tr.V2Args = append(tr.V2Args, fmt.Sprintf("%s?address=%s&port=%s", connName, h, p))
10241038
} else {
10251039
// just port
1026-
args = append(args, fmt.Sprintf("%s?port=%s", connName, netAddr))
1040+
tr.V2Args = append(tr.V2Args, fmt.Sprintf("%s?port=%s", connName, netAddr))
10271041
}
10281042
case "unix":
10291043
if strings.HasPrefix(netAddr, "/") {
1030-
args = append(args, fmt.Sprintf("%s?unix-socket-path=%s", connName, netAddr))
1044+
tr.V2Args = append(tr.V2Args, fmt.Sprintf("%s?unix-socket-path=%s", connName, netAddr))
10311045
} else {
1032-
args = append(args, fmt.Sprintf("%s?unix-socket=%s", connName, netAddr))
1046+
tr.V2Args = append(tr.V2Args, fmt.Sprintf("%s?unix-socket=%s", connName, netAddr))
10331047
}
10341048
default:
1035-
return nil, false, false, nil, false, v2Compat, false, false // Unsupported network
1049+
return tr // Unsupported network
10361050
}
10371051
}
10381052

1039-
// V2 requires at least one instance OR fuse mode OR version OR instances_metadata
1040-
if len(instances) == 0 && !*useFuse && !*version && *instancesMetadata == "" {
1041-
return nil, false, false, nil, false, v2Compat, false, false
1053+
// V2 requires at least one instance OR fuse mode OR version OR instances_metadata OR projects
1054+
if len(instances) == 0 && !*useFuse && !*version && *instancesMetadata == "" && len(tr.Projects) == 0 {
1055+
return tr
10421056
}
10431057

1044-
return args, *logDebugStdoutFlag, *verboseFlag, nil, false, v2Compat, false, true
1058+
tr.OK = true
1059+
return tr
10451060
}

0 commit comments

Comments
 (0)