@@ -9,7 +9,7 @@ import { LocalAppClient } from '@gitpod/local-app-api-grpcweb/lib/localapp_pb_se
9
9
import { NodeHttpTransport } from '@improbable-eng/grpc-web-node-http-transport' ;
10
10
import { grpc } from '@improbable-eng/grpc-web' ;
11
11
import { Workspace , WorkspaceInstanceStatus_Phase } from '@gitpod/public-api/lib/gitpod/experimental/v1/workspaces_pb' ;
12
- import { UserSSHPublicKeyValue , WorkspaceInfo , WorkspaceInstancePhase } from '@gitpod/gitpod-protocol' ;
12
+ import { UserSSHPublicKeyValue , WorkspaceInfo } from '@gitpod/gitpod-protocol' ;
13
13
import * as cp from 'child_process' ;
14
14
import * as fs from 'fs' ;
15
15
import * as http from 'http' ;
@@ -110,7 +110,7 @@ class LocalAppError extends Error {
110
110
}
111
111
112
112
class NoRunningInstanceError extends Error {
113
- constructor ( readonly workspaceId : string , phase ?: WorkspaceInstancePhase ) {
113
+ constructor ( readonly workspaceId : string , readonly phase ?: string ) {
114
114
super ( `Failed to connect to ${ workspaceId } Gitpod workspace, workspace not running: ${ phase } ` ) ;
115
115
}
116
116
}
@@ -480,11 +480,16 @@ export class RemoteConnector extends Disposable {
480
480
sshKeysSupported ? ( this . publicApi ? this . publicApi . getSSHKeys ( ) : service . server . getSSHPublicKeys ( ) ) : undefined
481
481
] ) , this . logger ) ;
482
482
483
- const isRunning = this . publicApi
484
- ? ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . RUNNING
485
- : ( workspaceInfo as WorkspaceInfo ) . latestInstance ?. status ?. phase === 'running' ;
486
- if ( ! isRunning ) {
487
- throw new NoRunningInstanceError ( workspaceId ) ;
483
+ const isNotRunning = this . publicApi
484
+ ? ! ( ( workspaceInfo as Workspace ) ?. status ?. instance ) || ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . STOPPING || ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase === WorkspaceInstanceStatus_Phase . STOPPED
485
+ : ! ( ( workspaceInfo as WorkspaceInfo ) . latestInstance ) || ( workspaceInfo as WorkspaceInfo ) . latestInstance ?. status ?. phase === 'stopping' || ( workspaceInfo as WorkspaceInfo ) . latestInstance ?. status ?. phase === 'stopped' ;
486
+ if ( isNotRunning ) {
487
+ throw new NoRunningInstanceError (
488
+ workspaceId ,
489
+ this . publicApi
490
+ ? ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase ? WorkspaceInstanceStatus_Phase [ ( workspaceInfo as Workspace ) ?. status ?. instance ?. status ?. phase ! ] : undefined
491
+ : ( workspaceInfo as WorkspaceInfo ) . latestInstance ?. status ?. phase
492
+ ) ;
488
493
}
489
494
490
495
const workspaceUrl = this . publicApi
@@ -747,7 +752,7 @@ export class RemoteConnector extends Disposable {
747
752
let sshDestination : SSHDestination | undefined ;
748
753
if ( ! forceUseLocalApp ) {
749
754
const openSSHVersion = await getOpenSSHVersion ( ) ;
750
- const gatewayFlow = { kind : 'gateway' , openSSHVersion, userOverride, ...sshFlow } ;
755
+ const gatewayFlow : UserFlowTelemetry = { kind : 'gateway' , openSSHVersion, userOverride, ...sshFlow } ;
751
756
try {
752
757
this . telemetry . sendUserFlowStatus ( 'connecting' , gatewayFlow ) ;
753
758
@@ -775,6 +780,7 @@ export class RemoteConnector extends Disposable {
775
780
// Do nothing and continue execution
776
781
} else if ( e instanceof NoRunningInstanceError ) {
777
782
this . logger . error ( 'No Running instance:' , e ) ;
783
+ gatewayFlow [ 'phase' ] = e . phase ;
778
784
this . notifications . showErrorMessage ( `Failed to connect to ${ e . workspaceId } Gitpod workspace: workspace not running` , { flow : gatewayFlow , id : 'no_running_instance' } ) ;
779
785
return ;
780
786
} else {
@@ -1027,7 +1033,7 @@ export class RemoteConnector extends Disposable {
1027
1033
1028
1034
const workspaceInfo = await withServerApi ( session ! . accessToken , connectionInfo . gitpodHost , service => service . server . getWorkspace ( connectionInfo . workspaceId ) , this . logger ) ;
1029
1035
1030
- if ( workspaceInfo . latestInstance ?. status ?. phase !== 'running ') {
1036
+ if ( ! workspaceInfo . latestInstance || workspaceInfo . latestInstance ?. status ?. phase === 'stopping' || workspaceInfo . latestInstance ?. status ?. phase === 'stopped ') {
1031
1037
throw new NoRunningInstanceError ( connectionInfo . workspaceId , workspaceInfo . latestInstance ?. status ?. phase ) ;
1032
1038
}
1033
1039
@@ -1071,12 +1077,13 @@ export class RemoteConnector extends Disposable {
1071
1077
1072
1078
vscode . commands . executeCommand ( 'setContext' , 'gitpod.inWorkspace' , true ) ;
1073
1079
} catch ( e ) {
1074
- const remoteFlow = { ...connectionInfo , userId : session ?. account . id , flow : 'remote_window' } ;
1080
+ const remoteFlow : UserFlowTelemetry = { ...connectionInfo , userId : session ?. account . id , flow : 'remote_window' } ;
1075
1081
if ( e instanceof NoRunningInstanceError ) {
1076
1082
this . logger . error ( 'No Running instance:' , e ) ;
1077
1083
const workspaceUrl = new URL ( connectionInfo . gitpodHost ) ;
1078
1084
workspaceUrl . pathname = '/start' ;
1079
1085
workspaceUrl . hash = connectionInfo . workspaceId ;
1086
+ remoteFlow [ 'phase' ] = e . phase ;
1080
1087
this . showWsNotRunningDialog ( connectionInfo . workspaceId , workspaceUrl . toString ( ) , remoteFlow ) ;
1081
1088
return ;
1082
1089
}
0 commit comments