@@ -787,6 +787,46 @@ func (s *service) buildRootDrive(req *proto.CreateVMRequest) []models.Drive {
787787 return builder .Build ()
788788}
789789
790+ func (s * service ) newIOProxy (logger * logrus.Entry , stdin , stdout , stderr string , extraData * proto.ExtraData ) (vm.IOProxy , error ) {
791+ var ioConnectorSet vm.IOProxy
792+
793+ relVSockPath , err := s .jailer .JailPath ().FirecrackerVSockRelPath ()
794+ if err != nil {
795+ return nil , errors .Wrapf (err , "failed to get relative path to firecracker vsock" )
796+ }
797+
798+ if vm .IsAgentOnlyIO (stdout , logger ) {
799+ ioConnectorSet = vm .NewNullIOProxy ()
800+ } else {
801+ var stdinConnectorPair * vm.IOConnectorPair
802+ if stdin != "" {
803+ stdinConnectorPair = & vm.IOConnectorPair {
804+ ReadConnector : vm .ReadFIFOConnector (stdin ),
805+ WriteConnector : vm .VSockDialConnector (relVSockPath , extraData .StdinPort ),
806+ }
807+ }
808+
809+ var stdoutConnectorPair * vm.IOConnectorPair
810+ if stdout != "" {
811+ stdoutConnectorPair = & vm.IOConnectorPair {
812+ ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StdoutPort ),
813+ WriteConnector : vm .WriteFIFOConnector (stdout ),
814+ }
815+ }
816+
817+ var stderrConnectorPair * vm.IOConnectorPair
818+ if stderr != "" {
819+ stderrConnectorPair = & vm.IOConnectorPair {
820+ ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StderrPort ),
821+ WriteConnector : vm .WriteFIFOConnector (stderr ),
822+ }
823+ }
824+
825+ ioConnectorSet = vm .NewIOConnectorProxy (stdinConnectorPair , stdoutConnectorPair , stderrConnectorPair )
826+ }
827+ return ioConnectorSet , nil
828+ }
829+
790830func (s * service ) Create (requestCtx context.Context , request * taskAPI.CreateTaskRequest ) (* taskAPI.CreateTaskResponse , error ) {
791831 logger := s .logger .WithField ("task_id" , request .ID )
792832 defer logPanicAndDie (logger )
@@ -857,41 +897,9 @@ func (s *service) Create(requestCtx context.Context, request *taskAPI.CreateTask
857897 return nil , err
858898 }
859899
860- relVSockPath , err := s .jailer . JailPath (). FirecrackerVSockRelPath ( )
900+ ioConnectorSet , err := s .newIOProxy ( logger , request . Stdin , request . Stdout , request . Stderr , extraData )
861901 if err != nil {
862- return nil , errors .Wrapf (err , "failed to get relative path to firecracker vsock" )
863- }
864-
865- var ioConnectorSet vm.IOProxy
866-
867- if vm .IsAgentOnlyIO (request .Stdout , logger ) {
868- ioConnectorSet = vm .NewNullIOProxy ()
869- } else {
870- var stdinConnectorPair * vm.IOConnectorPair
871- if request .Stdin != "" {
872- stdinConnectorPair = & vm.IOConnectorPair {
873- ReadConnector : vm .FIFOConnector (request .Stdin ),
874- WriteConnector : vm .VSockDialConnector (relVSockPath , extraData .StdinPort ),
875- }
876- }
877-
878- var stdoutConnectorPair * vm.IOConnectorPair
879- if request .Stdout != "" {
880- stdoutConnectorPair = & vm.IOConnectorPair {
881- ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StdoutPort ),
882- WriteConnector : vm .FIFOConnector (request .Stdout ),
883- }
884- }
885-
886- var stderrConnectorPair * vm.IOConnectorPair
887- if request .Stderr != "" {
888- stderrConnectorPair = & vm.IOConnectorPair {
889- ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StderrPort ),
890- WriteConnector : vm .FIFOConnector (request .Stderr ),
891- }
892- }
893-
894- ioConnectorSet = vm .NewIOConnectorProxy (stdinConnectorPair , stdoutConnectorPair , stderrConnectorPair )
902+ return nil , err
895903 }
896904
897905 // override the request with the bundle dir that should be used inside the VM
@@ -987,41 +995,9 @@ func (s *service) Exec(requestCtx context.Context, req *taskAPI.ExecProcessReque
987995 return nil , err
988996 }
989997
990- relVSockPath , err := s .jailer . JailPath (). FirecrackerVSockRelPath ( )
998+ ioConnectorSet , err := s .newIOProxy ( logger , req . Stdin , req . Stdout , req . Stderr , extraData )
991999 if err != nil {
992- return nil , errors .Wrapf (err , "failed to get relative path to firecracker vsock" )
993- }
994-
995- var ioConnectorSet vm.IOProxy
996-
997- if vm .IsAgentOnlyIO (req .Stdout , logger ) {
998- ioConnectorSet = vm .NewNullIOProxy ()
999- } else {
1000- var stdinConnectorPair * vm.IOConnectorPair
1001- if req .Stdin != "" {
1002- stdinConnectorPair = & vm.IOConnectorPair {
1003- ReadConnector : vm .FIFOConnector (req .Stdin ),
1004- WriteConnector : vm .VSockDialConnector (relVSockPath , extraData .StdinPort ),
1005- }
1006- }
1007-
1008- var stdoutConnectorPair * vm.IOConnectorPair
1009- if req .Stdout != "" {
1010- stdoutConnectorPair = & vm.IOConnectorPair {
1011- ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StdoutPort ),
1012- WriteConnector : vm .FIFOConnector (req .Stdout ),
1013- }
1014- }
1015-
1016- var stderrConnectorPair * vm.IOConnectorPair
1017- if req .Stderr != "" {
1018- stderrConnectorPair = & vm.IOConnectorPair {
1019- ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StderrPort ),
1020- WriteConnector : vm .FIFOConnector (req .Stderr ),
1021- }
1022- }
1023-
1024- ioConnectorSet = vm .NewIOConnectorProxy (stdinConnectorPair , stdoutConnectorPair , stderrConnectorPair )
1000+ return nil , err
10251001 }
10261002
10271003 resp , err := s .taskManager .ExecProcess (requestCtx , req , s .agentClient , ioConnectorSet )
0 commit comments