@@ -18,6 +18,7 @@ package main
1818import (
1919 "bufio"
2020 "bytes"
21+ "context"
2122 "errors"
2223 "fmt"
2324 "log"
@@ -26,16 +27,18 @@ import (
2627 "path/filepath"
2728 "strings"
2829
30+ "github.com/apache/beam/sdks/v2/go/container/tools"
2931 "github.com/apache/beam/sdks/v2/go/pkg/beam/core/runtime/xlangx/expansionx"
3032 "github.com/apache/beam/sdks/v2/go/pkg/beam/util/execx"
3133)
3234
3335// pipInstallRequirements installs the given requirement, if present.
34- func pipInstallRequirements (files []string , dir , name string ) error {
36+ func pipInstallRequirements (ctx context. Context , logger * tools. Logger , files []string , dir , name string ) error {
3537 pythonVersion , err := expansionx .GetPythonVersion ()
3638 if err != nil {
3739 return err
3840 }
41+ bufLogger := tools .NewBufferedLogger (logger )
3942 for _ , file := range files {
4043 if file == name {
4144 // We run the install process in two rounds in order to avoid as much
@@ -50,7 +53,13 @@ func pipInstallRequirements(files []string, dir, name string) error {
5053 // also installs dependencies. The key is that if all the packages have
5154 // been installed in the first round then this command will be a no-op.
5255 args = []string {"-m" , "pip" , "install" , "-q" , "-r" , filepath .Join (dir , name ), "--no-cache-dir" , "--disable-pip-version-check" , "--find-links" , dir }
53- return execx .Execute (pythonVersion , args ... )
56+ err := execx .ExecuteEnvWithIO (nil , os .Stdin , bufLogger , bufLogger , pythonVersion , args ... )
57+ if err != nil {
58+ bufLogger .FlushAtError (ctx )
59+ return err
60+ }
61+ bufLogger .FlushAtDebug (ctx )
62+ return nil
5463 }
5564 }
5665 return nil
@@ -69,11 +78,12 @@ func isPackageInstalled(pkgName string) bool {
6978}
7079
7180// pipInstallPackage installs the given package, if present.
72- func pipInstallPackage (files []string , dir , name string , force , optional bool , extras []string ) error {
81+ func pipInstallPackage (ctx context. Context , logger * tools. Logger , files []string , dir , name string , force , optional bool , extras []string ) error {
7382 pythonVersion , err := expansionx .GetPythonVersion ()
7483 if err != nil {
7584 return err
7685 }
86+ bufLogger := tools .NewBufferedLogger (logger )
7787 for _ , file := range files {
7888 if file == name {
7989 var packageSpec = name
@@ -97,19 +107,34 @@ func pipInstallPackage(files []string, dir, name string, force, optional bool, e
97107 // installed version will match the package specified, the package itself
98108 // will not be reinstalled, but its dependencies will now be resolved and
99109 // installed if necessary. This achieves our goal outlined above.
100- args := []string {"-m" , "pip" , "install" , "-q" , "- -no-cache-dir" , "--disable-pip-version-check" , "--upgrade" , "--force-reinstall" , "--no-deps" ,
110+ args := []string {"-m" , "pip" , "install" , "--no-cache-dir" , "--disable-pip-version-check" , "--upgrade" , "--force-reinstall" , "--no-deps" ,
101111 filepath .Join (dir , packageSpec )}
102- err := execx .Execute ( pythonVersion , args ... )
112+ err := execx .ExecuteEnvWithIO ( nil , os . Stdin , bufLogger , bufLogger , pythonVersion , args ... )
103113 if err != nil {
114+ bufLogger .FlushAtError (ctx )
104115 return err
116+ } else {
117+ bufLogger .FlushAtDebug (ctx )
105118 }
106- args = []string {"-m" , "pip" , "install" , "-q" , "--no-cache-dir" , "--disable-pip-version-check" , filepath .Join (dir , packageSpec )}
107- return execx .Execute (pythonVersion , args ... )
119+ args = []string {"-m" , "pip" , "install" , "--no-cache-dir" , "--disable-pip-version-check" , filepath .Join (dir , packageSpec )}
120+ err = execx .ExecuteEnvWithIO (nil , os .Stdin , bufLogger , bufLogger , pythonVersion , args ... )
121+ if err != nil {
122+ bufLogger .FlushAtError (ctx )
123+ return err
124+ }
125+ bufLogger .FlushAtDebug (ctx )
126+ return nil
108127 }
109128
110129 // Case when we do not perform a forced reinstall.
111- args := []string {"-m" , "pip" , "install" , "-q" , "--no-cache-dir" , "--disable-pip-version-check" , filepath .Join (dir , packageSpec )}
112- return execx .Execute (pythonVersion , args ... )
130+ args := []string {"-m" , "pip" , "install" , "--no-cache-dir" , "--disable-pip-version-check" , filepath .Join (dir , packageSpec )}
131+ err := execx .ExecuteEnvWithIO (nil , os .Stdin , bufLogger , bufLogger , pythonVersion , args ... )
132+ if err != nil {
133+ bufLogger .FlushAtError (ctx )
134+ return err
135+ }
136+ bufLogger .FlushAtDebug (ctx )
137+ return nil
113138 }
114139 }
115140 if optional {
@@ -120,7 +145,7 @@ func pipInstallPackage(files []string, dir, name string, force, optional bool, e
120145
121146// installExtraPackages installs all the packages declared in the extra
122147// packages manifest file.
123- func installExtraPackages (files []string , extraPackagesFile , dir string ) error {
148+ func installExtraPackages (ctx context. Context , logger * tools. Logger , files []string , extraPackagesFile , dir string ) error {
124149 // First check that extra packages manifest file is present.
125150 for _ , file := range files {
126151 if file != extraPackagesFile {
@@ -139,7 +164,7 @@ func installExtraPackages(files []string, extraPackagesFile, dir string) error {
139164 for s .Scan () {
140165 extraPackage := s .Text ()
141166 log .Printf ("Installing extra package: %s" , extraPackage )
142- if err = pipInstallPackage (files , dir , extraPackage , true , false , nil ); err != nil {
167+ if err = pipInstallPackage (ctx , logger , files , dir , extraPackage , true , false , nil ); err != nil {
143168 return fmt .Errorf ("failed to install extra package %s: %v" , extraPackage , err )
144169 }
145170 }
@@ -167,13 +192,13 @@ func findBeamSdkWhl(files []string, acceptableWhlSpecs []string) string {
167192// assume that the pipleine was started with the Beam SDK found in the wheel
168193// file, and we try to install it. If not successful, we fall back to installing
169194// SDK from source tarball provided in sdkSrcFile.
170- func installSdk (files []string , workDir string , sdkSrcFile string , acceptableWhlSpecs []string , required bool ) error {
195+ func installSdk (ctx context. Context , logger * tools. Logger , files []string , workDir string , sdkSrcFile string , acceptableWhlSpecs []string , required bool ) error {
171196 sdkWhlFile := findBeamSdkWhl (files , acceptableWhlSpecs )
172197
173198 if sdkWhlFile != "" {
174199 // by default, pip rejects to install wheel if same version already installed
175200 isDev := strings .Contains (sdkWhlFile , ".dev" )
176- err := pipInstallPackage (files , workDir , sdkWhlFile , isDev , false , []string {"gcp" })
201+ err := pipInstallPackage (ctx , logger , files , workDir , sdkWhlFile , isDev , false , []string {"gcp" })
177202 if err == nil {
178203 return nil
179204 }
@@ -185,6 +210,6 @@ func installSdk(files []string, workDir string, sdkSrcFile string, acceptableWhl
185210 return nil
186211 }
187212 }
188- err := pipInstallPackage (files , workDir , sdkSrcFile , false , false , []string {"gcp" })
213+ err := pipInstallPackage (ctx , logger , files , workDir , sdkSrcFile , false , false , []string {"gcp" })
189214 return err
190215}
0 commit comments