@@ -9,7 +9,7 @@ import { LocalAppClient } from '@gitpod/local-app-api-grpcweb/lib/localapp_pb_se
99import { NodeHttpTransport } from '@improbable-eng/grpc-web-node-http-transport' ;
1010import { grpc } from '@improbable-eng/grpc-web' ;
1111import { 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' ;
1313import * as cp from 'child_process' ;
1414import * as fs from 'fs' ;
1515import * as http from 'http' ;
@@ -110,7 +110,7 @@ class LocalAppError extends Error {
110110}
111111
112112class NoRunningInstanceError extends Error {
113- constructor ( readonly workspaceId : string , phase ?: WorkspaceInstancePhase ) {
113+ constructor ( readonly workspaceId : string , readonly phase ?: string ) {
114114 super ( `Failed to connect to ${ workspaceId } Gitpod workspace, workspace not running: ${ phase } ` ) ;
115115 }
116116}
@@ -480,11 +480,16 @@ export class RemoteConnector extends Disposable {
480480 sshKeysSupported ? ( this . publicApi ? this . publicApi . getSSHKeys ( ) : service . server . getSSHPublicKeys ( ) ) : undefined
481481 ] ) , this . logger ) ;
482482
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+ ) ;
488493 }
489494
490495 const workspaceUrl = this . publicApi
@@ -747,7 +752,7 @@ export class RemoteConnector extends Disposable {
747752 let sshDestination : SSHDestination | undefined ;
748753 if ( ! forceUseLocalApp ) {
749754 const openSSHVersion = await getOpenSSHVersion ( ) ;
750- const gatewayFlow = { kind : 'gateway' , openSSHVersion, userOverride, ...sshFlow } ;
755+ const gatewayFlow : UserFlowTelemetry = { kind : 'gateway' , openSSHVersion, userOverride, ...sshFlow } ;
751756 try {
752757 this . telemetry . sendUserFlowStatus ( 'connecting' , gatewayFlow ) ;
753758
@@ -775,6 +780,7 @@ export class RemoteConnector extends Disposable {
775780 // Do nothing and continue execution
776781 } else if ( e instanceof NoRunningInstanceError ) {
777782 this . logger . error ( 'No Running instance:' , e ) ;
783+ gatewayFlow [ 'phase' ] = e . phase ;
778784 this . notifications . showErrorMessage ( `Failed to connect to ${ e . workspaceId } Gitpod workspace: workspace not running` , { flow : gatewayFlow , id : 'no_running_instance' } ) ;
779785 return ;
780786 } else {
@@ -1027,7 +1033,7 @@ export class RemoteConnector extends Disposable {
10271033
10281034 const workspaceInfo = await withServerApi ( session ! . accessToken , connectionInfo . gitpodHost , service => service . server . getWorkspace ( connectionInfo . workspaceId ) , this . logger ) ;
10291035
1030- if ( workspaceInfo . latestInstance ?. status ?. phase !== 'running ') {
1036+ if ( ! workspaceInfo . latestInstance || workspaceInfo . latestInstance ?. status ?. phase === 'stopping' || workspaceInfo . latestInstance ?. status ?. phase === 'stopped ') {
10311037 throw new NoRunningInstanceError ( connectionInfo . workspaceId , workspaceInfo . latestInstance ?. status ?. phase ) ;
10321038 }
10331039
@@ -1071,12 +1077,13 @@ export class RemoteConnector extends Disposable {
10711077
10721078 vscode . commands . executeCommand ( 'setContext' , 'gitpod.inWorkspace' , true ) ;
10731079 } 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' } ;
10751081 if ( e instanceof NoRunningInstanceError ) {
10761082 this . logger . error ( 'No Running instance:' , e ) ;
10771083 const workspaceUrl = new URL ( connectionInfo . gitpodHost ) ;
10781084 workspaceUrl . pathname = '/start' ;
10791085 workspaceUrl . hash = connectionInfo . workspaceId ;
1086+ remoteFlow [ 'phase' ] = e . phase ;
10801087 this . showWsNotRunningDialog ( connectionInfo . workspaceId , workspaceUrl . toString ( ) , remoteFlow ) ;
10811088 return ;
10821089 }
0 commit comments