Skip to content

Commit

Permalink
Merge branch 'main' into feat/write-n-read-w-encoding
Browse files Browse the repository at this point in the history
Signed-off-by: Trae Yelovich <[email protected]>
  • Loading branch information
traeok committed Jan 23, 2025
2 parents 8c33829 + 2aa43ec commit fd998b3
Show file tree
Hide file tree
Showing 38 changed files with 706 additions and 152 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ dumps
artifacts
lib
node_modules
out
tsconfig.tsbuildinfo
zowe.config.json
zowe.schema.json
5 changes: 5 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"recommendations": [
"amodio.tsl-problem-matcher"
]
}
22 changes: 22 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// A launch configuration that compiles the extension and then opens it inside a new window
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
{
"version": "0.2.0",
"configurations": [
{
"name": "Run Extension",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}/packages/vsce"
],
"outFiles": [
"${workspaceFolder}/packages/vsce/out/**/*.js"
],
"preLaunchTask": "npm: watch"
}
]
}
21 changes: 21 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "watch",
"problemMatcher": "$ts-webpack-watch",
"isBackground": true,
"presentation": {
"reveal": "never"
},
"group": {
"kind": "build",
"isDefault": true
},
"path": "./packages/vsce"
}
]
}
2 changes: 1 addition & 1 deletion biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
},
"files": {
"ignoreUnknown": false,
"ignore": []
"ignore": ["**/*.js"]
},
"formatter": {
"enabled": true,
Expand Down
22 changes: 11 additions & 11 deletions doc/apis.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
| API | Backend | Middleware | SDK | CLI | VSCE |
| ---------------- | ------- | ---------- | --- | --- | ---- |
| List data sets ||||| |
| List members ||||| |
| List USS files ||||| |
| List jobs ||||| |
| List spool files ||| || |
| Read data set ||||| |
| Read USS file ||| |||
| Read spool file ||| || |
| Write data set ||| |||
| Write USS file ||| |||
| Get job JCL ||| || |
| List data sets ||||| |
| List members ||||| |
| List USS files ||||| |
| List jobs ||||| |
| List spool files ||| || |
| Read data set ||||| |
| Read USS file ||| |||
| Read spool file ||| || |
| Write data set ||| |||
| Write USS file ||| |||
| Get job JCL ||| || |
11 changes: 8 additions & 3 deletions native/golang/job.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func HandleListSpoolsRequest(jsonData []byte) {
return
}

args := []string{"./zowex", "job", "list-files", listRequest.JobId}
args := []string{"./zowex", "job", "list-files", listRequest.JobId, "--rfc", "1"}

out, err := exec.Command(args[0], args[1:]...).Output()
if err != nil {
Expand All @@ -82,9 +82,14 @@ func HandleListSpoolsRequest(jsonData []byte) {
if len(vals) < 4 {
continue
}
id, err := strconv.Atoi(strings.TrimSpace(vals[2]))
if err != nil {
continue
}
response.Items[i] = Spool{
Id: vals[0],
Name: strings.TrimSpace(vals[2]),
Id: id,
DdName: vals[0],
StepName: vals[3],
}
}

Expand Down
2 changes: 1 addition & 1 deletion native/golang/messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ type ListJobsRequest struct {

// command: "listSpools"
type ListSpoolsRequest struct {
JobId string `json:"jobid"`
JobId string `json:"jobId"`
}

// command: "readDataset"
Expand Down
5 changes: 3 additions & 2 deletions native/golang/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ type Job struct {
}

type Spool struct {
Id string `json:"id"`
Name string `json:"name"`
Id int `json:"id"`
DdName string `json:"ddname"`
StepName string `json:"stepname"`
}
63 changes: 62 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,9 @@ import { SshBaseHandler } from "../../SshBaseHandler";
export default class ListDataSetMembersHandler extends SshBaseHandler {
public async processWithSession(params: IHandlerParameters, session: SshSession): Promise<ListDsMembers.Response> {
using client = await ZSshClient.create(session);
const request: ListDsMembers.Request = {
command: "listDsMembers",
const response = await client.ds.listDsMembers({
dataset: params.arguments.dsname,
};
const response = await client.request<ListDsMembers.Response>(request);
});
params.response.data.setMessage(
"Successfully listed %d members in data sets %s",
response.returnedRows,
Expand Down
6 changes: 2 additions & 4 deletions packages/cli/src/list/data-set/DataSet.handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,9 @@ import { SshBaseHandler } from "../../SshBaseHandler";
export default class ListDataSetsHandler extends SshBaseHandler {
public async processWithSession(params: IHandlerParameters, session: SshSession): Promise<ListDatasets.Response> {
using client = await ZSshClient.create(session);
const request: ListDatasets.Request = {
command: "listDatasets",
const response = await client.ds.listDatasets({
pattern: params.arguments.pattern,
};
const response = await client.request<ListDatasets.Response>(request);
});
params.response.data.setMessage(
"Successfully listed %d matching data sets for pattern '%s'",
response.returnedRows,
Expand Down
6 changes: 2 additions & 4 deletions packages/cli/src/list/jobs/Jobs.handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,11 @@ import { SshBaseHandler } from "../../SshBaseHandler";
export default class ListJobsHandler extends SshBaseHandler {
public async processWithSession(params: IHandlerParameters, session: SshSession): Promise<ListJobs.Response> {
using client = await ZSshClient.create(session);
const request: ListJobs.Request = {
command: "listJobs",
const response = await client.jobs.listJobs({
owner: params.arguments.owner,
prefix: params.arguments.prefix,
status: params.arguments.status,
};
const response = await client.request<ListJobs.Response>(request);
});
params.response.data.setMessage("Successfully listed %d matching jobs", response.items.length);
params.response.format.output({
output: response.items,
Expand Down
6 changes: 2 additions & 4 deletions packages/cli/src/list/uss-files/UssFiles.handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,9 @@ export default class ListUssFilesHandler extends SshBaseHandler {
// const directory = UssUtils.normalizeUnixPath(params.arguments.directory);
const directory = params.arguments.directory;
using client = await ZSshClient.create(session);
const request: ListFiles.Request = {
command: "listFiles",
const response = await client.uss.listFiles({
fspath: directory,
};
const response = await client.request<ListFiles.Response>(request);
});
params.response.data.setMessage("Listed files in uss directory %s", directory);
params.response.format.output({
output: response.items,
Expand Down
10 changes: 4 additions & 6 deletions packages/cli/src/view/data-set/DataSet.handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,18 @@

import type { IHandlerParameters } from "@zowe/imperative";
import type { SshSession } from "@zowe/zos-uss-for-zowe-sdk";
import { type ReadDataset, ZSshClient } from "zowe-native-proto-sdk";
import { type ReadDataset, ZSshClient, ZSshUtils } from "zowe-native-proto-sdk";
import { SshBaseHandler } from "../../SshBaseHandler";

export default class ViewDataSetHandler extends SshBaseHandler {
public async processWithSession(params: IHandlerParameters, session: SshSession): Promise<ReadDataset.Response> {
using client = await ZSshClient.create(session);
const request: ReadDataset.Request = {
command: "readDataset",
const response = await client.ds.readDataset({
dataset: params.arguments.dataSet,
// binary: params.arguments.binary,
encoding: params.arguments.encoding,
};
const response = await client.request<ReadDataset.Response>(request);
const content = Buffer.from(response.data as unknown as string, "base64").toString();
});
const content = ZSshUtils.decodeByteArray(response.data).toString();
params.response.data.setMessage(
"Successfully downloaded %d bytes of content from %s",
content.length,
Expand Down
45 changes: 45 additions & 0 deletions packages/sdk/src/AbstractRpcClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import type { IRpcRequest, IRpcResponse } from "./doc";
import type * as ds from "./doc/zos-ds";
import type * as jobs from "./doc/zos-jobs";
import type * as uss from "./doc/zos-uss";

export abstract class AbstractRpcClient {
public abstract request<T extends IRpcResponse>(request: IRpcRequest): Promise<T>;

public get ds() {
return {
listDatasets: (request: Omit<ds.ListDatasets.Request, "command">): Promise<ds.ListDatasets.Response> =>
this.request({ command: "listDatasets", ...request }),
listDsMembers: (request: Omit<ds.ListDsMembers.Request, "command">): Promise<ds.ListDsMembers.Response> =>
this.request({ command: "listDsMembers", ...request }),
readDataset: (request: Omit<ds.ReadDataset.Request, "command">): Promise<ds.ReadDataset.Response> =>
this.request({ command: "readDataset", ...request }),
writeDataset: (request: Omit<ds.WriteDataset.Request, "command">): Promise<ds.WriteDataset.Response> =>
this.request({ command: "writeDataset", ...request }),
};
}

public get jobs() {
return {
getJcl: (request: Omit<jobs.GetJcl.Request, "command">): Promise<jobs.GetJcl.Response> =>
this.request({ command: "getJcl", ...request }),
listJobs: (request: Omit<jobs.ListJobs.Request, "command">): Promise<jobs.ListJobs.Response> =>
this.request({ command: "listJobs", ...request }),
listSpools: (request: Omit<jobs.ListSpools.Request, "command">): Promise<jobs.ListSpools.Response> =>
this.request({ command: "listSpools", ...request }),
readSpool: (request: Omit<jobs.ReadSpool.Request, "command">): Promise<jobs.ReadSpool.Response> =>
this.request({ command: "readSpool", ...request }),
};
}

public get uss() {
return {
listFiles: (request: Omit<uss.ListFiles.Request, "command">): Promise<uss.ListFiles.Response> =>
this.request({ command: "listFiles", ...request }),
readFile: (request: Omit<uss.ReadFile.Request, "command">): Promise<uss.ReadFile.Response> =>
this.request({ command: "readFile", ...request }),
writeFile: (request: Omit<uss.WriteFile.Request, "command">): Promise<uss.WriteFile.Response> =>
this.request({ command: "writeFile", ...request }),
};
}
}
7 changes: 5 additions & 2 deletions packages/sdk/src/ZSshClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ import type { Writable } from "node:stream";
import { DeferredPromise } from "@zowe/imperative";
import type { SshSession } from "@zowe/zos-uss-for-zowe-sdk";
import { Client, type ClientChannel, type ConnectConfig } from "ssh2";
import { AbstractRpcClient } from "./AbstractRpcClient";
import type { IRpcRequest, IRpcResponse } from "./doc";

export class ZSshClient implements Disposable {
export class ZSshClient extends AbstractRpcClient implements Disposable {
private static readonly SERVER_CMD = "cd zowe-native-proto/golang && ./ioserver";

private mSshClient: Client;
Expand All @@ -14,7 +15,9 @@ export class ZSshClient implements Disposable {
private mResponseStream: Writable | undefined;
private sshMutex: DeferredPromise<void> | undefined;

private constructor() {}
private constructor() {
super();
}

public static async create(session: SshSession): Promise<ZSshClient> {
const client = new ZSshClient();
Expand Down
Loading

0 comments on commit fd998b3

Please sign in to comment.