Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c4a01a42ce | |||
| c0aeb2fc2e | |||
| 908d236a19 | |||
| f519db88fb | |||
| e996e8b7e8 | |||
| da60671b33 | |||
| 963a1404c0 | |||
| 002110228c |
@@ -0,0 +1,50 @@
|
||||
package coderd_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
agentproto "github.com/coder/coder/v2/agent/proto"
|
||||
"github.com/coder/coder/v2/coderd/coderdtest"
|
||||
"github.com/coder/coder/v2/coderd/database"
|
||||
"github.com/coder/coder/v2/coderd/database/dbfake"
|
||||
"github.com/coder/coder/v2/codersdk/agentsdk"
|
||||
"github.com/coder/coder/v2/provisionersdk/proto"
|
||||
"github.com/coder/coder/v2/testutil"
|
||||
)
|
||||
|
||||
func TestAgentAPI_LargeManifest(t *testing.T) {
|
||||
t.Parallel()
|
||||
ctx := testutil.Context(t, testutil.WaitLong)
|
||||
client, store := coderdtest.NewWithDatabase(t, nil)
|
||||
adminUser := coderdtest.CreateFirstUser(t, client)
|
||||
n := 512000
|
||||
longScript := make([]byte, n)
|
||||
for i := range longScript {
|
||||
longScript[i] = 'q'
|
||||
}
|
||||
r := dbfake.WorkspaceBuild(t, store, database.Workspace{
|
||||
OrganizationID: adminUser.OrganizationID,
|
||||
OwnerID: adminUser.UserID,
|
||||
}).WithAgent(func(agents []*proto.Agent) []*proto.Agent {
|
||||
agents[0].Scripts = []*proto.Script{
|
||||
{
|
||||
Script: string(longScript),
|
||||
},
|
||||
}
|
||||
return agents
|
||||
}).Do()
|
||||
ac := agentsdk.New(client.URL)
|
||||
ac.SetSessionToken(r.AgentToken)
|
||||
conn, err := ac.ConnectRPC(ctx)
|
||||
defer func() {
|
||||
_ = conn.Close()
|
||||
}()
|
||||
require.NoError(t, err)
|
||||
agentAPI := agentproto.NewDRPCAgentClient(conn)
|
||||
manifest, err := agentAPI.GetManifest(ctx, &agentproto.GetManifestRequest{})
|
||||
require.NoError(t, err)
|
||||
require.Len(t, manifest.Scripts, 1)
|
||||
require.Len(t, manifest.Scripts[0].Script, n)
|
||||
}
|
||||
@@ -688,6 +688,9 @@ func (c *wsNetConn) Close() error {
|
||||
// during read or write will cancel the context, but not close the
|
||||
// conn. Close should be called to release context resources.
|
||||
func websocketNetConn(ctx context.Context, conn *websocket.Conn, msgType websocket.MessageType) (context.Context, net.Conn) {
|
||||
// Set the read limit to 4 MiB -- about the limit for protobufs. This needs to be larger than
|
||||
// the default because some of our protocols can include large messages like startup scripts.
|
||||
conn.SetReadLimit(1 << 22)
|
||||
ctx, cancel := context.WithCancel(ctx)
|
||||
nc := websocket.NetConn(ctx, conn, msgType)
|
||||
return ctx, &wsNetConn{
|
||||
|
||||
@@ -286,8 +286,11 @@ func ProtoFromAppHealthsRequest(req PostAppHealthsRequest) (*proto.BatchUpdateAp
|
||||
if !ok {
|
||||
return nil, xerrors.Errorf("unknown app health: %s", h)
|
||||
}
|
||||
|
||||
var idCopy uuid.UUID
|
||||
copy(idCopy[:], id[:])
|
||||
pReq.Updates = append(pReq.Updates, &proto.BatchUpdateAppHealthRequest_HealthUpdate{
|
||||
Id: id[:],
|
||||
Id: idCopy[:],
|
||||
Health: proto.AppHealth(hp),
|
||||
})
|
||||
}
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 155 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
@@ -0,0 +1,107 @@
|
||||
## Changelog
|
||||
|
||||
### Features
|
||||
|
||||
- Coder will now autofill parameters in the "create workspace" page based on the previous value (#11731) (@ammario)
|
||||

|
||||
- Change default Terraform version to v1.6 and relax max version constraint (#12027) (@johnstcn)
|
||||
- Show workspace name suggestions below the name field (#12001) (@aslilac)
|
||||
- Add favorite/unfavorite commands (@johnstcn)
|
||||
- Add .zip support for Coder templates (#11839) (#12032) (@mtojek)
|
||||
- Add support for `--wait` and scripts that block login (#10473) (@mafredri)
|
||||
- Users can mark workspaces as favorite to show up at the top of their list (#11875) (#11793) (#11878) (#11791) (@johnstcn)
|
||||

|
||||
- Add Prometheus metrics to servertailnet (#11988) (@coadler)
|
||||
- Add support for concurrent scenarios (#11753) (@mafredri)
|
||||
- Display user avatar on workspace page (#11893) (@BrunoQuaresma)
|
||||
- Do not show popover on update deadline (#11921) (@BrunoQuaresma)
|
||||
- Simplify "Create Template" form by removing advanced settings (#11918) (@BrunoQuaresma)
|
||||
- Show deprecation message on template page (#11996) (@BrunoQuaresma)
|
||||
- Check agent API version on connection (#11696)
|
||||
- Add "updated" search param to workspaces (#11714)
|
||||
- Add option to speedtest to dump a pcap of network traffic (#11848) (@coadler)
|
||||
- Add logging to client tailnet yamux (#11908) (@spikecurtis)
|
||||
- Add customizable upgrade message on client/server version mismatch (#11587) (@sreya)
|
||||
- Add logging to pgcoord subscribe/unsubscribe (#11952) (@spikecurtis)
|
||||
- Add logging to pgPubsub (#11953) (@spikecurtis)
|
||||
- Add logging to agent yamux session (#11912) (@spikecurtis)
|
||||
- Move agent v2 API connection monitoring to yamux layer (#11910) (@spikecurtis)
|
||||
- Add statsReporter for reporting stats on agent v2 API (#11920) (@spikecurtis)
|
||||
- Add metrics to PGPubsub (#11971) (@spikecurtis)
|
||||
- Add custom error message on signups disabled page (#11959) (@mtojek)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- Make ServerTailnet set peers lost when it reconnects to the coordinator (#11682)
|
||||
- Properly auto-update workspace on SSH if template policy is set (#11773)
|
||||
- Allow template name length of 32 in template push and create (#11915) (@mafredri)
|
||||
- Alter return signature of convertWorkspace, add check for requesterID (#11796) (@johnstcn)
|
||||
- Fix limit in `GetUserWorkspaceBuildParameters` (#11954) (@mafredri)
|
||||
- Fix test flake in TestHeartbeat (#11808) (@johnstcn)
|
||||
- Do not cache context cancellation errors (#11840) (@johnstcn)
|
||||
- Fix startup script on workspace creation (#11958) (@matifali)
|
||||
- Fix startup script looping (#11972) (@code-asher)
|
||||
- Add ID to default columns in licenses list output (#11823) (@johnstcn)
|
||||
- Handle query canceled error in sendBeat() (#11794) (@johnstcn)
|
||||
- Fix proxy settings link (#11817) (@BrunoQuaresma)
|
||||
- Disable autostart and autostop according to template settings (#11809) (@Kira-Pilot)
|
||||
- Fix capitalized username (#11891) (@BrunoQuaresma)
|
||||
- Fix parameters' request upon template variables update (#11898) (@BrunoQuaresma)
|
||||
- Fix text overflow on batch ws deletion (#11981) (@BrunoQuaresma)
|
||||
- Fix parameter input icon shrink (#11995) (@BrunoQuaresma)
|
||||
- Use TSMP ping for reachability, not latency (#11749)
|
||||
- Display error when fetching OAuth2 provider apps (#11713)
|
||||
- Fix code-server path based forwarding, defer to code-server (#11759)
|
||||
- Use correct logger for lifecycle_executor (#11763)
|
||||
- Disable keepalives in workspaceapps transport (#11789) (@coadler)
|
||||
- Accept agent RPC connection without version query parameter (#11790) (@spikecurtis)
|
||||
- Stop spamming DERP map updates for equivalent maps (#11792) (@spikecurtis)
|
||||
- Check update permission to start workspace (#11798) (@mtojek)
|
||||
- Always attempt external auth refresh when fetching (#11762) (@Emyrk)
|
||||
- Stop running tests that exec sh scripts in parallel (#11834) (@spikecurtis)
|
||||
- Fix type error from theme update (#11844) (@aslilac)
|
||||
- Use new context after t.Parallel in TestOAuthAppSecrets (@spikecurtis)
|
||||
- Always attempt external auth refresh when fetching (#11762) (#11830) (@Emyrk)
|
||||
- Wait for new template version before promoting (#11874) (@spikecurtis)
|
||||
- Respect wait flag on ping (#11896) (@f0ssel)
|
||||
- Fix cliui prompt styling (#11899) (@aslilac)
|
||||
- Fix prevent agent_test.go from failing on error logs (#11909) (@spikecurtis)
|
||||
- Add timeout to listening ports request (#11935) (@coadler)
|
||||
- Only delete expired agents on success (#11940) (@coadler)
|
||||
- Close MultiAgentConn when coordinator closes (#11941) (@spikecurtis)
|
||||
- Strip timezone information from a date in dau response (#11962) (@Emyrk)
|
||||
- Improve click UX and styling for Auth Token page (#11863) (@Parkreiner)
|
||||
- Rewrite url to agent ip in single tailnet (#11810) (@coadler)
|
||||
- Avoid race in TestPGPubsub_Metrics by using Eventually (#11973) (@spikecurtis)
|
||||
- Always return a clean http client for promoauth (#11963) (@Emyrk)
|
||||
- Change build status colors (#11985) (@aslilac)
|
||||
- Only display xray results if vulns > 0 (#11989) (@sreya)
|
||||
- Use dark background in terminal, even when a light theme is selected (#12004) (@aslilac)
|
||||
- Fix graceful disconnect in DialWorkspaceAgent (#11993) (@spikecurtis)
|
||||
- Stop logging error on query canceled (#12017) (@spikecurtis)
|
||||
- Only display quota if it is higher than 0 (#11979) (@BrunoQuaresma)
|
||||
|
||||
### Documentation
|
||||
|
||||
- Using coder modules in offline deployments (#11788) (@matifali)
|
||||
- Simplify JFrog integration docs (#11787) (@matifali)
|
||||
- Add guide for azure federation (#11864) (@ericpaulsen)
|
||||
- Fix example template README 404s and semantics (#11903) (@ericpaulsen)
|
||||
- Update remote docker host docs (#11919) (@matifali)
|
||||
- Add FAQ for gateway reconnects (#12007) (@ericpaulsen)
|
||||
|
||||
### Code refactoring
|
||||
|
||||
- Apply cosmetic changes and remove ExternalAuth from settings page (#11756)
|
||||
- Minor improvements create workspace form (#11771)
|
||||
- Verify external auth before displaying workspace form (#11777) (@BrunoQuaresma)
|
||||
|
||||
Compare: [`v2.7.2...v2.7.3`](https://github.com/coder/coder/compare/v2.7.2...v2.7.3)
|
||||
|
||||
## Container image
|
||||
|
||||
- `docker pull ghcr.io/coder/coder:v2.7.3`
|
||||
|
||||
## Install/upgrade
|
||||
|
||||
Refer to our docs to [install](https://coder.com/docs/v2/latest/install) or [upgrade](https://coder.com/docs/v2/latest/admin/upgrade) Coder, or use a release asset below.
|
||||
@@ -0,0 +1,15 @@
|
||||
## Changelog
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- Fixed an issue where workspace apps may never be marked as healthy.
|
||||
|
||||
Compare: [`v2.8.1...v2.8.2`](https://github.com/coder/coder/compare/v2.8.1...v2.8.2)
|
||||
|
||||
## Container image
|
||||
|
||||
- `docker pull ghcr.io/coder/coder:v2.8.2`
|
||||
|
||||
## Install/upgrade
|
||||
|
||||
Refer to our docs to [install](https://coder.com/docs/v2/latest/install) or [upgrade](https://coder.com/docs/v2/latest/admin/upgrade) Coder, or use a release asset below.
|
||||
@@ -1,4 +1,9 @@
|
||||
import type { PropsWithChildren, FC } from "react";
|
||||
import {
|
||||
type PropsWithChildren,
|
||||
type FC,
|
||||
forwardRef,
|
||||
HTMLAttributes,
|
||||
} from "react";
|
||||
import Tooltip from "@mui/material/Tooltip";
|
||||
import { type Interpolation, type Theme } from "@emotion/react";
|
||||
import { Stack } from "components/Stack/Stack";
|
||||
@@ -74,9 +79,14 @@ export const NotReachableBadge: FC = () => {
|
||||
);
|
||||
};
|
||||
|
||||
export const DisabledBadge: FC = () => {
|
||||
export const DisabledBadge: FC = forwardRef<
|
||||
HTMLSpanElement,
|
||||
HTMLAttributes<HTMLSpanElement>
|
||||
>((props, ref) => {
|
||||
return (
|
||||
<span
|
||||
{...props}
|
||||
ref={ref}
|
||||
css={[
|
||||
styles.badge,
|
||||
(theme) => ({
|
||||
@@ -89,7 +99,7 @@ export const DisabledBadge: FC = () => {
|
||||
Disabled
|
||||
</span>
|
||||
);
|
||||
};
|
||||
});
|
||||
|
||||
export const EnterpriseBadge: FC = () => {
|
||||
return (
|
||||
|
||||
+10
@@ -105,3 +105,13 @@ export const Loading: Story = {
|
||||
isLoading: true,
|
||||
},
|
||||
};
|
||||
|
||||
export const AutoStopAndStartOff: Story = {
|
||||
args: {
|
||||
initialValues: {
|
||||
...defaultInitialValues,
|
||||
autostartEnabled: false,
|
||||
autostopEnabled: false,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
+34
@@ -379,3 +379,37 @@ describe("templateInheritance", () => {
|
||||
expect(ttlInput).toBeDisabled();
|
||||
});
|
||||
});
|
||||
|
||||
test("form should be enabled when both auto stop and auto start features are disabled, given that the template permits these actions", async () => {
|
||||
jest.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate);
|
||||
render(
|
||||
<WorkspaceScheduleForm
|
||||
{...defaultFormProps}
|
||||
initialValues={{
|
||||
...defaultFormProps.initialValues,
|
||||
autostopEnabled: false,
|
||||
autostartEnabled: false,
|
||||
}}
|
||||
/>,
|
||||
);
|
||||
|
||||
const submitButton = await screen.findByRole("button", { name: "Submit" });
|
||||
expect(submitButton).toBeEnabled();
|
||||
});
|
||||
|
||||
test("form should be disabled when both auto stop and auto start features are disabled at template level", async () => {
|
||||
jest.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate);
|
||||
render(
|
||||
<WorkspaceScheduleForm
|
||||
{...defaultFormProps}
|
||||
allowTemplateAutoStart={false}
|
||||
allowTemplateAutoStop={false}
|
||||
initialValues={{
|
||||
...defaultFormProps.initialValues,
|
||||
}}
|
||||
/>,
|
||||
);
|
||||
|
||||
const submitButton = await screen.findByRole("button", { name: "Submit" });
|
||||
expect(submitButton).toBeDisabled();
|
||||
});
|
||||
|
||||
+3
-4
@@ -441,10 +441,9 @@ export const WorkspaceScheduleForm: FC<WorkspaceScheduleFormProps> = ({
|
||||
<FormFooter
|
||||
onCancel={onCancel}
|
||||
isLoading={isLoading}
|
||||
submitDisabled={
|
||||
(!allowTemplateAutoStart && !allowTemplateAutoStop) ||
|
||||
(!form.values.autostartEnabled && !form.values.autostopEnabled)
|
||||
}
|
||||
// If both options, autostart and autostop, are disabled at the template
|
||||
// level, the form is disabled.
|
||||
submitDisabled={!allowTemplateAutoStart && !allowTemplateAutoStop}
|
||||
/>
|
||||
</HorizontalForm>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user