@@ -793,6 +793,46 @@ func (s *service) buildRootDrive(req *proto.CreateVMRequest) []models.Drive {
793793 return builder .Build ()
794794}
795795
796+ func (s * service ) newIOProxy (logger * logrus.Entry , stdin , stdout , stderr string , extraData * proto.ExtraData ) (vm.IOProxy , error ) {
797+ var ioConnectorSet vm.IOProxy
798+
799+ relVSockPath , err := s .jailer .JailPath ().FirecrackerVSockRelPath ()
800+ if err != nil {
801+ return nil , errors .Wrapf (err , "failed to get relative path to firecracker vsock" )
802+ }
803+
804+ if vm .IsAgentOnlyIO (stdout , logger ) {
805+ ioConnectorSet = vm .NewNullIOProxy ()
806+ } else {
807+ var stdinConnectorPair * vm.IOConnectorPair
808+ if stdin != "" {
809+ stdinConnectorPair = & vm.IOConnectorPair {
810+ ReadConnector : vm .ReadFIFOConnector (stdin ),
811+ WriteConnector : vm .VSockDialConnector (relVSockPath , extraData .StdinPort ),
812+ }
813+ }
814+
815+ var stdoutConnectorPair * vm.IOConnectorPair
816+ if stdout != "" {
817+ stdoutConnectorPair = & vm.IOConnectorPair {
818+ ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StdoutPort ),
819+ WriteConnector : vm .WriteFIFOConnector (stdout ),
820+ }
821+ }
822+
823+ var stderrConnectorPair * vm.IOConnectorPair
824+ if stderr != "" {
825+ stderrConnectorPair = & vm.IOConnectorPair {
826+ ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StderrPort ),
827+ WriteConnector : vm .WriteFIFOConnector (stderr ),
828+ }
829+ }
830+
831+ ioConnectorSet = vm .NewIOConnectorProxy (stdinConnectorPair , stdoutConnectorPair , stderrConnectorPair )
832+ }
833+ return ioConnectorSet , nil
834+ }
835+
796836func (s * service ) Create (requestCtx context.Context , request * taskAPI.CreateTaskRequest ) (* taskAPI.CreateTaskResponse , error ) {
797837 logger := s .logger .WithField ("task_id" , request .ID )
798838 defer logPanicAndDie (logger )
@@ -863,41 +903,9 @@ func (s *service) Create(requestCtx context.Context, request *taskAPI.CreateTask
863903 return nil , err
864904 }
865905
866- relVSockPath , err := s .jailer . JailPath (). FirecrackerVSockRelPath ( )
906+ ioConnectorSet , err := s .newIOProxy ( logger , request . Stdin , request . Stdout , request . Stderr , extraData )
867907 if err != nil {
868- return nil , errors .Wrapf (err , "failed to get relative path to firecracker vsock" )
869- }
870-
871- var ioConnectorSet vm.IOProxy
872-
873- if vm .IsAgentOnlyIO (request .Stdout , logger ) {
874- ioConnectorSet = vm .NewNullIOProxy ()
875- } else {
876- var stdinConnectorPair * vm.IOConnectorPair
877- if request .Stdin != "" {
878- stdinConnectorPair = & vm.IOConnectorPair {
879- ReadConnector : vm .FIFOConnector (request .Stdin ),
880- WriteConnector : vm .VSockDialConnector (relVSockPath , extraData .StdinPort ),
881- }
882- }
883-
884- var stdoutConnectorPair * vm.IOConnectorPair
885- if request .Stdout != "" {
886- stdoutConnectorPair = & vm.IOConnectorPair {
887- ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StdoutPort ),
888- WriteConnector : vm .FIFOConnector (request .Stdout ),
889- }
890- }
891-
892- var stderrConnectorPair * vm.IOConnectorPair
893- if request .Stderr != "" {
894- stderrConnectorPair = & vm.IOConnectorPair {
895- ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StderrPort ),
896- WriteConnector : vm .FIFOConnector (request .Stderr ),
897- }
898- }
899-
900- ioConnectorSet = vm .NewIOConnectorProxy (stdinConnectorPair , stdoutConnectorPair , stderrConnectorPair )
908+ return nil , err
901909 }
902910
903911 // override the request with the bundle dir that should be used inside the VM
@@ -993,41 +1001,9 @@ func (s *service) Exec(requestCtx context.Context, req *taskAPI.ExecProcessReque
9931001 return nil , err
9941002 }
9951003
996- relVSockPath , err := s .jailer . JailPath (). FirecrackerVSockRelPath ( )
1004+ ioConnectorSet , err := s .newIOProxy ( logger , req . Stdin , req . Stdout , req . Stderr , extraData )
9971005 if err != nil {
998- return nil , errors .Wrapf (err , "failed to get relative path to firecracker vsock" )
999- }
1000-
1001- var ioConnectorSet vm.IOProxy
1002-
1003- if vm .IsAgentOnlyIO (req .Stdout , logger ) {
1004- ioConnectorSet = vm .NewNullIOProxy ()
1005- } else {
1006- var stdinConnectorPair * vm.IOConnectorPair
1007- if req .Stdin != "" {
1008- stdinConnectorPair = & vm.IOConnectorPair {
1009- ReadConnector : vm .FIFOConnector (req .Stdin ),
1010- WriteConnector : vm .VSockDialConnector (relVSockPath , extraData .StdinPort ),
1011- }
1012- }
1013-
1014- var stdoutConnectorPair * vm.IOConnectorPair
1015- if req .Stdout != "" {
1016- stdoutConnectorPair = & vm.IOConnectorPair {
1017- ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StdoutPort ),
1018- WriteConnector : vm .FIFOConnector (req .Stdout ),
1019- }
1020- }
1021-
1022- var stderrConnectorPair * vm.IOConnectorPair
1023- if req .Stderr != "" {
1024- stderrConnectorPair = & vm.IOConnectorPair {
1025- ReadConnector : vm .VSockDialConnector (relVSockPath , extraData .StderrPort ),
1026- WriteConnector : vm .FIFOConnector (req .Stderr ),
1027- }
1028- }
1029-
1030- ioConnectorSet = vm .NewIOConnectorProxy (stdinConnectorPair , stdoutConnectorPair , stderrConnectorPair )
1006+ return nil , err
10311007 }
10321008
10331009 resp , err := s .taskManager .ExecProcess (requestCtx , req , s .agentClient , ioConnectorSet )
0 commit comments