Build error: field 'kills' has incomplete type 'QMap<QString, int>'

Seems like you forgot #include <QMap> in world.h
make: *** [Makefile:1363: moc_world.o] Error 1
make: *** Waiting for unfinished jobs....
In file included from mainwindow.h:8,
                 from moc_mainwindow.cpp:10:
./world.h:109:25: error: field 'kills' has incomplete type 'QMap<QString, int>'
  109 |   QMap<QString, qint32> kills;
      |                         ^~~~~
In file included from /usr/include/qt/QtCore/qglobal.h:1296,
                 from /usr/include/qt/QtGui/qtguiglobal.h:43,
                 from /usr/include/qt/QtWidgets/qtwidgetsglobal.h:43,
                 from /usr/include/qt/QtWidgets/qmainwindow.h:43,
                 from /usr/include/qt/QtWidgets/QMainWindow:1,
                 from mainwindow.h:5,
                 from moc_mainwindow.cpp:10:
/usr/include/qt/QtCore/qtypeinfo.h:240:1: note: declaration of 'class QMap<QString, int>'
  240 | Q_DECLARE_MOVABLE_CONTAINER(QMap);
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~
make: *** [Makefile:1354: moc_mainwindow.o] Error 1

I ran into this as well while building.

awesome, thank you!


[Feature Request]: [Go SDK] Add option to create table if needed in bigqueryio.Write()

What would you like to happen?
bigqueryio.Write() allows you to write into BigQuery while providing a table string in the format of project:dataset.table. At the moment, if the table doesn't exist, it will fail. And there's no option like .withCreateDisposition(CreateDisposition.CREATE_IF_NEEDED) in the Java SDK to create the table if it doesn't exist.
It will be a great feature to add this. The pipeline already checks if the PCollection has a valid schema with the existing table, so we can use this information (T of schema type) to create the table if needed.
Issue Priority
Priority: 0
Issue Component
Component: io-go-gcp

fyi @youngoli

This is a good feature, and something I originally intended. When I first tried, I ran into issues getting the create disposition working with the Storage Write API. But it's absolutely something we should aim for since this is a feature in both the Java and Python native versions of BQ IO.


Small improvements (performance, ensure valid constructor usage)

Increased perfomance of to_array method.
Following good rule "any perfomance should be proven by benchmark" I provide following code: https://gist.github.com/Ginden/4b3ca5bc48634fa9500c

toArray1 took 13.677ms on 32768 arrays
toArray2 [current] took 20.659ms on 32768 arrays
toArray3 [new] took 11.943ms on 32768 arrays
toArray4 took 12.269ms on 32768 arrays

'use strict' directive was added to enforce valid constructor usage. It's minor "potentially breaking" change - it will make already buggy code fail earlier.

@Ginden Your benchmark does not really test what you think it does. toArray1, toArray3 and toArray4 are all using the same functions internal and the first is going to warm the other ones up. In fact your test does not take that into acount. v8 has a jit and has to be warmed up before comparing. So you should have warmed all functions up. Besides that the dummyObject does not return any value ;).
But that's not really my concern. The to_array function is there for slicing arguments. You did not benchmark this for arguments but for simple arrays.
After all, [].slice.call(arr); is indeed faster for simple arrays but the function will leak arguments and deopt in v8 if you use this for arguments.
In that case the slice will be drastically slower than the function in place right now.

@BridgeAR:

Your benchmark does not really test what you think it does. toArray1, toArray3 and toArray4 are all using the same functions internal and the first is going to warm the other ones up.
This statement isn't true. Functions provided in standard library are treated specially, being [almost] always inlined, [almost] always optimized and so on.

After all, [].slice.call(arr); is indeed faster for simple arrays but the function will leak arguments and deopt in v8 if you use this for arguments.
In that case the slice will be drastically slower than the function in place right now.
This statement isn't true, too. If you are calling func(arguments) deopt does not depend on func internals.
BTW - AFAIR it doesn't causes deopt but prevents optimization.

And even if your argument isn't true (arguments materialization isn't benchmarked here), your thesis is true - it's slower. https://gist.github.com/Ginden/4b3ca5bc48634fa9500c

toArray1 took 29.041ms on 32768 arrays
toArray2 took 11.748ms on 32768 arrays
toArray3 took 19.089ms on 32768 arrays
toArray4 took 19.222ms on 32768 arrays

Besides that the dummyObject does not return any value
This statement is true.
You did not benchmark this for arguments but for simple arrays.
You are right.

It wouldn't surprise me if at some point V8 would implement a faster way to do this. But to_array is there because this process kept showing up on the flame graphs.


Regarding the coordinates returned by iris detection

Iris detection retuns the coordinates of the eye and iris, as well as the area around, including eyebrow. However, the coordinates of those areas outside the eye are often inaccurate, resulting in distorted geometry around the eyes under some situations. The coordinates of those areas can be safely discarded and just use the original ones provided by Facemesh without affecting the functioning of the iris detection. This can be easily done by commenting out/removing some lines of MESH_TO_IRIS_INDICES_MAP under the file coords.js. Personally I would say at least those coordinates regarding the eyebrow should be removed (since the iris version overwrites the coordinates from Facemesh and distort the detection of eyebrow).
const MESH_TO_IRIS_INDICES_MAP = [ // A mapping from facemesh model keypoints to iris model keypoints.
  { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] },
  { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] },
  { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] },
  { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] },
  { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] },
  { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] },
  { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] },
//  { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] },
//  { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] },
];

i've checked and i agree.
changed via https://github.com/vladmandic/human/commit/06b7922f62c08236377725e76f2fff84a101270c

i've checked and i agree.
changed via https://github.com/vladmandic/human/commit/06b7922f62c08236377725e76f2fff84a101270c


How should the future cust::memory look like? (Originally: Should pitched alloc and 2D memcpy be exposed in cust?)

This issue was really going to be about malloc pitch and 2D, but then I realized maybe the whole cust::memory needed a little refurbish.
Cuda gives better performance when rows are aligned in a specific manner. For 2D arrays (e.g. images) it is common to use cudaMallocPitch for allocation and cudaMemcpy2D for copying. In addition there exists corresponding functions for 3D which makes things a bit more complex as the cuda array type must be used.
The first question is: Should these be exposed, in some way, in cust? I think the answer is yes, or else there would be unnecessarily difficult to write code that is as performant as when using for host code C/C++.
The second question is: How should these functions be exposed in cust? Cuda is all over the place when it comes to naming, argument lists, return values and even how things really work. Should we follow the cuda runtime API to make it as similar as possible for the C++ crowd? Or should try to make cust::memory as coherent as possible?
I understand both sides, but it seems to me the goal for this project is to make Cuda in Rust as good as it can be without being afraid of diverging from how it works in C++. The logical solution might then be to try to improve on naming and function signatures.
When I started looking at this I realized that the current cust::memory module is not very unified either. The alloc and memcpy functions operate of different types (cust::DevicePointer vs CUdeviceptr), size specifications (bytes vs elements) and constraints (when allocing T must be DeviceCopy). How should the feature complete cust::memory look like?

the memory module is kind of a mess, it was a bit of a mess from rustacuda, then incrementally we started changing and adding things,  but a lot of the odd stuff is still left in there. In particular the decisions for using DevicePointer vs CUdevicePtr. Its not even over yet, DeviceSlice will probably get another rework per #44

Would it be acceptable to add pitched malloc in the most pragmatic way to at least be able to use it? Or should the module be improved before that?

yeah i think adding a malloc_pitched function would be fine, idk about adding pitched methods in DeviceBuffer and such, i havent researched pitched memory much


Expose URL to the CI build

Component
server
Describe the bug
Woodpecker copies CI_PIPELINE_URL to DRONE_BUILD_LINK https://github.com/woodpecker-ci/woodpecker/blob/main/pipeline/frontend/metadata/drone_compatibility.go#L31. This is IMO wrong as the drone build link contains a link to the drone job e.g. https://drone.example.com/octocat/hello-world/42 while the CI pipeline URL contains a link to the forge event (e.g. commit)  https://github.com/octocat/hello-world/commit/8019104
While looking into it, it looks like there is no DRONE_BUILD_LINK equivalent available in Woodpecker yet? Exposing a proper URL to the Woodpecker pipeline would be helpful for notification plugins where I would like to get redirected to the Pipeline logs instead of the forge.
System Info
{"source":"https://github.com/woodpecker-ci/woodpecker","version":"next-4d83ea0d"}

Additional context
No response
Validations

[X] Read the Contributing Guidelines.
[X] Read the docs.
[X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
[X] Checked that the bug isn't fixed in the next version already [https://woodpecker-ci.org/faq#which-version-of-woodpecker-should-i-use]
[X] Check that this is a concrete bug. For Q&A join our Discord Chat Server or the Matrix room.

Especially as there is CI_COMMIT_URL already, I'm wondering why CI_PIPELINE_URL also contains a link to the forge.

I somehow remember this bug being mentioned somewhere before. I agree that CI_COMMIT_URL should be pointing to the forge and CI_PIPELINE_URL to the WP-UI

Can you give me a pointer where .Link for the pipeline is set?

In pipeline/stepBuilder.go we set CI_PIPELINE_URL to m.Curr.Link which should be the link to the forge.

But where is m.Curr.Link coming from?


Cache Tanzu CLI and plugin builder in Docker build stages

Description
Include a summary of the change. If this change fixes an issue, indicate that on the Fixes line. Briefly include
relevant context and motivation.
Changes:

Tanzu CLI and plugin builder are cached in Docker build stages.
Update Tanzu CLI version to v0.90.beta.0, but retain Plugin Builder v0.90.alpha.2 due to incompatibility with current BTI.

Fixes #103
I tested this in Tanzu Framework. See testing notes in https://github.com/vmware-tanzu/tanzu-framework/pull/4629.
Change Details
Check all that apply:

[x] New feature
[ ] Bug fix
[ ] Non-code change
[ ] Non-breaking change
[ ] Breaking change
[ ] Requires a documentation change

Release Note

Cache Tanzu CLI and plugin builder in Docker build stages

How Has This Been Tested?
Describe any testing done to verify changes. Provide enough detail that tests can be reproduced.
Checklist:

[ ] My code follows the Contribution and Style guidelines of this project
[ ] My changes generate no new warnings
[ ] New and existing unit tests pass locally with my changes
[ ] I have added test details that prove my fix is effective or that my feature works

@yharish991, good catch. Tanzu CLI team has made the beta version unavailable. They have released a new version, which I have referenced in a new commit.


feat: show help when no arguments are provided

Summary:
This PR adds the default behaviour of calling the CLI without any args to be the --help command.
Fixes #158.
Test Plan:
Run the following:
node path/to/the/react-native-cli/packages/cli/build/index.js
node path/to/the/react-native-cli/packages/global-cli/index.js

I made some visual adjustments locally. What do you think?

Cool, thanks @thymikee & @Esemesek!


Resized images rotate

Resized images uploaded seem to rotate when they are resized. It seems to rotate image taken with the camera directly uploaded from a WebView 90 CCW. Images uploaded from the camera roll seem to rotate 180.
return try req.content.decode(UserFile.self).map(to: Response.self) { data in
            // create an array of the file types we're willing to accept
            let acceptableTypes = [MediaType.png, MediaType.jpeg]

            for file in data.upload {
                // ensure this image is one of the valid types
                guard let mimeType = file.contentType else { continue }
                guard acceptableTypes.contains(mimeType) else { continue }

                // replace any spaces in filenames with a dash
               /let cleanedFilename = file.filename.replacingOccurrences(of: " ", with: "-")

                // convert that into a URL we can write to
                let newURL = originalsDirectory.appendingPathComponent(cleanedFilename)

                // write the full-size original image
                _ = try? file.data.write(to: newURL)

                // create a matching URL in the thumbnails directory
                let thumbURL = thumbsDirectory.appendingPathComponent(cleanedFilename)

                // attempt to load the original into a SwiftGD image
                if let image = Image(url: newURL) {
                    // attempt to resize that down to a thumbnail
                    if let resized = image.resizedTo(width: 300) {

                        // it worked – save it!
                        resized.write(to: thumbURL)

                        var tags = [String]()
                        if data.tag_line != nil {
                            tags.append(data.tag_line!)
                        }

                        let p = //Create a Photo object to save

                        p.save(on: req)

                    }
                }
            }

            return req.redirect(to: "upload")
        }

Follow up. It appears that my issue was with using a WKWebView. Seems the flag for orientation gets messed up some how. Just switched to using Alamofire for the multipart upload and things seem to be just fine.

I have the same exact issue, the full size image is the correct direction, but resized one are not

In 2024 I'm having exactly the same issue

In 2024 I'm having exactly the same issue

I fixed this by using another Package along side to get the image data and rotate is again after resizing
SwiftExif
enum ImageOrientation : Int {
    case normal = 1 //= 0 degrees: the correct orientation, no adjustment is required.
    case normalMirrored = 2 //= 0 degrees, mirrored: image has been flipped back-to-front.
    case upSideDown = 3 //= 180 degrees: image is upside down.
    case upSideDownMirrored = 4 //= 180 degrees, mirrored: image has been flipped back-to-front and is upside down.
    case leftRotatedMirrored = 5 //= 90 degrees: image has been flipped back-to-front and is on its side.
    case leftRotated = 6 //= 90 degrees, mirrored: image is on its side.
    case rightRotatedMirrored = 7 //= 270 degrees: image has been flipped back-to-front and is on its far side.
    case rightRotated = 8 //= 270 degrees, mirrored: image is on its far side.

    func degrees() -> Float {
        switch self {
        case .normal, .normalMirrored:
            return 0
        case .upSideDown,  .upSideDownMirrored:
            return 180
        case .leftRotatedMirrored, .leftRotated:
            return -90
        case .rightRotatedMirrored, .rightRotated:
            return 90
        }
    }
    func flip() -> Bool {
        switch self {
        case .normal, .upSideDown, .leftRotated, .rightRotated:
            return false
        case .normalMirrored, .upSideDownMirrored, .leftRotatedMirrored, .rightRotatedMirrored:
            return true
        }
    }
}

// MARK :- After Re-Sizing
 let exifImage = SwiftExif.Image(imagePath: image).ExifRaw()

if let rawOrientation = exifImage["0"]?["Orientation"], let intOrientation = Int(rawOrientation), let orientation = ImageOrientation(rawValue: intOrientation) {
            modifiedImage?.rotate(angle: orientation.degrees())
            if orientation.flip() {
                modifiedImage?.flip(.horizontal)
            }
}


File a weekly PR

When GK is enabled, it's typical to get a lot of PRs.
It'd be nice if there were an option to set a regular interval, i.e. check every monday and file a PR if dependencies have changed.

Weekly could be nice, or even just having GK update a single PR with all of the relevant changes until you merge it

Single-PR defies the purpose of knowing which dependency update broke the build.
From the screenshot above I can tell that most of these PRs could be avoided by using version ranges instead of pinned dependencies.
See https://blog.greenkeeper.io/announcing-real-time-dependency-break-detection-for-greenkeeper-4f7558c10d77 how this works and at the same time ensures against the downsides of version ranges.
Hope this helps :)

@janl it helps to understand the problem of ranged vs pinned deps, but mass pr bombing is still an issue

I'm happy to tell you that we've just rolled out the new Greenkeeper that is based on GitHub integrations. You can try it out today: https://github.com/integration/greenkeeper
There are several changes that affect this feature request.

GitHub no longer sends eMail notifications for PRs created by bots
We will now only create a single PR (out of range) or Issue (in range) per dependency at a time, and keep that up to date with comments. The noise should be greatly reduced.

We think that these changes make this feature requests unnecessary, but we're happy to reconsider once you've tried it.
Installing the integration will automatically enable Greenkeeper for all repos that you can grant access for, and that have a package.json file present.
Please be aware that this is currently in its early phase. Before installing it we recommend disabling the old Greenkeeper.
Thanks for your feedback.
We'd love to hear what you think about the new Greenkeeer as well.
Best,
Stephan


Arrays of mixed types are only allowed if the type is forced to Array

class Bug1 {
    public function bug() : Void {
        // Arrays of mixed types are only allowed if the type is forced to Array<Dynamic>
        // Bug in "safeArray"
        ["A", 1];
    }
}

See https://github.com/restorer/haxe-safety-bugs/blob/master/safetybugs/Main.hx#L43 for working example.

This is for Haxe 4.0.0-preview.5 and Safety from master.

This is not related to Safety. It's a pure Haxe behavior: http://try-haxe.mrcdk.com/#A3BF6

Sorry, bad example. I will provide correct example later.

Feel free to reopen.

Correct example:
class Bug1Corrected {
    public function foo(a : Array<Dynamic>) : Void {
        trace(a);
    }

    public function bug() : Void {
        // Arrays of mixed types are only allowed if the type is forced to Array<Dynamic>
        // Bug in "safeArray"
        foo(["A", 1]);
    }
}

Test project: https://github.com/restorer/haxe-safety-bugs/blob/master/safetybugs/Main.hx#L207
Pure Haxe: http://try-haxe.mrcdk.com/#CdD25
P.S. Also either I don't know how to reopen issues on github 😄 or I doesn't have permissions for that.


Wrong email link should also destroy session

This issue is imported from pivotal
As a user, if I click the \'Whoops wrong email\' link, the session which has been created for that email address must be destroyed. Not sure if this is already the case.

For now decided not to implement as there are - theoretical - scenario's where this can conflict with valid logins. (Okke Harsta - Mar 12, 2020)


No Diagnostic settings in monitor blade.

Is there a requirement for which version of the VPN Gateway you need to be using in order to setup diagnostic settings ? I don't see it in the documentation here and for my VPN Gateway I created I don't have any options for diagnostic settings.

VPN Sku: VpnGw1
Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: f4f81d07-fd9a-c911-b9b7-c2aa3c298f5b
Version Independent ID: 96a5f6c6-e7eb-57a3-8e64-c22f01e50a0b
Content: Azure VPN Gateway: Configure alerts on diagnostic resource log events
Content Source: articles/vpn-gateway/vpn-gateway-howto-setup-alerts-virtual-network-gateway-log.md
Service: vpn-gateway
GitHub Login: @anzaman
Microsoft Alias: alzam

@pablojmarti , For enabling diagnostics alerts on VPN gateway's you should go to Azure Monitor.
In search bar type Monitor and then add the diagnostic settings as shown in the document to the respective  VPN gateway.

@pablojmarti - you have to be at the top Resource Group level to see  "Diagnostic settings" not under the VPN Gateway blade.

@SubhashVasarapu-MSFT and @anzaman thank you I didn't realize it was in a different window.


Cannot get the Annotorious to init

I can see the OpenSeadragon plugin loaded in but I cannot draw anything.
<template>
    <div id="openseadragon1"  style="width: 800px; height: 600px;">

    </div>
</template>
<script>
//import { Annotorious } from '@recogito/annotorious';
import OpenSeadragon from 'openseadragon';
import axios from 'axios';
import * as Annotorious from '@recogito/annotorious-openseadragon';
import<EMAIL_ADDRESS>import<EMAIL_ADDRESS>export default {
    data() {
        return {
        postData: {
            userId: '',
            title:  '',
            body:   ''
        }
        }
    },
    components: {
        Annotorious
    },
    setup: () => ({
        title: 'Sample',

    }),
    mounted: () => {
        const viewer = OpenSeadragon({
            id: "openseadragon1",
            prefixUrl: "/openseadragon/images/",
            minZoomImageRatio: 0,
            maxZoomPixelRatio: Infinity,
            tileSources: {
                type: "image",
                url: "https://cdn.pixabay.com/photo/2020/02/16/20/29/nyc-4854718__340.jpg",
                fitBounds: true
            }
        });

    var options = {
        disableEditor: false // the default editor is disabled to implement a custom behaviour
    }

    var anno = Annotorious(viewer, options);
    anno.setDrawingTool('polygon');
   }
}
</script>

Please help me.

@rsimon kindly help me with this

See you holding shift when dragging?

No i'm not holding shift.

Is there a problem with my versions?
   "@recogito/annotorious": "^2.7.10",
        "@recogito/annotorious-openseadragon": "^2.7.10",
        "@recogito/annotorious-selector-pack": "^0.5.3",
        "@types/openseadragon": "^3.0.5",
        "openseadragon": "^4.0.0",
        "vue": "^3.2.36"

Well then I would warmly recommend reading at least through the first few lines of documentation :-) Thanks in advance.
https://recogito.github.io/annotorious/getting-started/osd-plugin/

Yes, I mean I have tried HOLDING the SHIFT key and NOT HODLING the SHIFT key.
It keeps dragging.
Is there a possible conflict with the versions, perhaps? If it's unnecessary, perhaps I'll close it.

No versions look fine. Are you able to set up an online demo. Otherwise I don't know what might be causing this.

Also, you might want to check the Gitter chat too. Might be an issue related to the interop with Vue. More people are reading the chat, and I don't have experience with Vue I'm afraid.

You could also try with OpenSeadragon v3.x just to be sure. Although AFAIK OSD v4 should work, too.

PS forgot to ask: are there any errors on the console when you init?


Feature Request : Allow filter "Legacy" content on Races too

I noticed ddb-importer do import Legacy content witch Race Muncher :

Is it possible to get a filter on race import too ?
Even better, I would love to filter on non-Legacy content in all importers.

Implemented


Incompatibility with Intake-ESM v2022.9.18

cases_metadata_to_catalog() in catalog_utils.py is incompatible with the most recent version of Intake-ESM, v2022.9.18. When the function tries to call intake.open_esm_datastore(), the following error is thrown: TypeError: esm_datastore.__init__() takes 2 positional arguments but 3 were given despite 2 arguments being given. The last version of Intake-ESM confirmed to work without this issue is v2021.8.17.

@rmshkv,
https://github.com/klindsay28/analysis_tools/blob/08bbee9dbc66e0f7486a01d45497d4bbca0ad06f/analysis_tools/catalog_utils.py#L108
should be changed to
return intake.open_esm_datastore({'data': esmcol_data, 'df': esmcol_spec})

Depending on whether you want to maintain backward compatibility, you may support versions older than v2022.9.18 as follows:

import packaging.version
import intake_esm

....
....
....

if packaging.version.Version('2022.9.22') < packaging.version.Version(intake_esm.__version__):
    return intake.open_esm_datastore(esmcol_data, esmcol_spec)
else:
    return intake.open_esm_datastore({'data': esmcol_data, 'df': esmcol_spec})

@rmshkv, i found a bug in my suggestions, and just updated the above comments to reflect the correct versions

fixed by #10


Revert "fix: hacky workaround to not use zlib bundled with SAM CLI In…

…staller (#141)"
This reverts commit 063b5cebc929f85ff9d95b2212ac2092eac96eee.
Issue #, if available:
Description of changes:
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

The PR checks are failing since the currently released version does not have the zlib fix. The nightly release was used instead (which contains the fix) inside of https://github.com/aws/aws-sam-build-images/actions/runs/8624005122/job/23638252127, which the workflow passes.


Support search history

It is very convenient if we have search history.

you can navigate search history using ↑ and ↓ keys.
See also #23099 for adding a dropdown list.

Thanks @yume-chan!


support for copilot

Seems like a feature that more and more people use in their IDEs

Thanks! I only add support for things I use myself, but it should be easy enough to add in your fork. I haven't tried copilot yet, but you never know — if I do, and like it, then I'd imagine support might appear here quickly!

Fair enough, thanks


Proposal:  Upload cover in bucket if drive is s3

Issue info:

[x] You have read and followed closely the Wiki, Upgrade Guide, as well as Troubleshooting
[x] The issue has not been reported before
[x] This is not a "how to install on Windows" or "why is my npm messed up" question
[x] You're a cool person

All checked? Now also make sure your issue

[ ] Is associated with a version. Or better yet, a commit.
[ ] Is as detailed as possible (ahem... OS, browser, steps to reproduce, maybe?)
[ ] Includes the error output if it's a bug/error report ("Whoops!" is not very helpful, you know)
[x] Is in English, 因为我不说中文。

Issue:
Recently i have dificutly to store cover in s3 bucket because the album->writeCoverFile use php functions to handler the archive.  I rewrited that methods whit Illuminate/Storage to support this feature.
fork from v3.7.2
https://github.com/Atiladanvi/koel/commit/fee35733a91125f5a8c5188ea5da7463db6530d0
https://github.com/Atiladanvi/koel/commit/e47c149f241a9f6fe7452b4c95c36b7f66009f64.
This can be merge ?

Thanks, but currently I don't have plans for such a feature yet :)


Excluded routes still appear in sitemap for prerendered pages

Describe the bug
Similar to https://github.com/harlan-zw/nuxt-simple-sitemap/issues/71 - we're using Nuxt to generate a large-ish website including blog posts and, in general, a lot of prerendered pages to serve statically, some of which should be excluded from the final sitemap.
We originally tried generating the sitemap by fetching our pages from the headless CMS, but that wouldn't work because we don't run a Node server but simply serve the SSG assets. The result was that all routes for all pregenerated/prerendered pages would end up in the sitemap.
Now, we switched to a exclude string array for routes that we don't want in the sitemap as a quick workaround, but unintuively all all routes for all pregenerated/prerendered pages end up in the sitemap. Disabling inferStaticPagesAsRoutes wouldn't help either, because then we'd have to partition (and hardcode) all our ~800 pages in include and exclude?
This issue is basically three things:

A question on "how does this plugin work", and/or "in which order do the sitemap generation steps happen". I guess the documentation could be improved in that point
A  potential bug since "it does not work as expected" - exclude doesn't work for pregenerated pages?
A clarification question on "how can I achieve what I want" 😉 how can I, for a setup with headless CMS and static site generation, sort my pages' routes to appear (or be hidden) in the sitemap, using this library 🙂

Thank you in advance!
Reproduction
No response
System / Nuxt Info
- Node Version:     v18.13.0
- Nuxt Version:     3.7.4
- CLI Version:      3.9.0
- Nitro Version:    2.6.3
- Package Manager<EMAIL_ADDRESS>

Hi please try the v4, I believe the logic is more sound for what you're trying to accomplish. Also, the docs have been updated so they should hopefully answer your questions.
Let me know if you still have issues.


Publish 04/11/2022, 10:30 AM

Docs Build status updates of commit 074161c:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

sharepoint/sharepoint-ps/sharepoint-online/Set-SPOTenant.md
:white_check_mark:Succeeded
View (sharepoint-ps)

For more details, please refer to the build report.
Note: Broken links written as relative paths are included in the above build report. For broken links written as absolute paths or external URLs, see the broken link report.
For any questions, please:Try searching the docs.microsoft.com contributor guidesPost your question in the Docs support channel


[PySimpleGUI] Background Image for the Window

I saw in the readme file this line of code:
my_widget.attributes['background-image'] = "url('/my_resources:image.png')"
It made me hopeful that I could add an image to my window "easily".
All of my windows share a similar structure.  There is a "Master Widget" that contains everything.  In this case, it's a remi.gui.VBox.
I attempted to perform this operation on my VBox, but it had no apparent impact, good nor bad.
self.master_widget.attributes['background-image'] = "url('{}')".format(self.window.BackgroundImage)

The string that was made when I ran my code was:

url('/res:logo.png')

I used this exact same "filename" to create an Image in my window and it worked, so the image path seems good.

@MikeTheWatchGuy use .style instead of .attributes and it will work
container.style['background-image'] = "url('/my_resources:logo.png')"

How does the image name different between this use and when it's used in a remi.gui.Image widget?
I am able to get the background image to some of the filenames that I used to make images, but some fail.
Here are some Image Elements.  I add a slash to the front of these filenames before giving to your Image widget.
            [sg.Image(filename=r'e:\DownloadsE\60a1a06a9458ccd6575333e06cb42f1b-png.jpg')],
            [sg.Image(filename=r'C:\Python\PycharmProjects\GooeyGUI\Logos\PySimpleGUI Icon.png', enable_events=True, key='_IMAGE_')],
            [sg.Image(filename=r'dot:logo.jpg')],
            [sg.Image(filename=r'res:logo.png')],

Using this filename from above:
r'dot:logo.jpg'
Works great.  I do have to add the url bit onto the front as I posted in my previous post.
What allows me to get away with c:, e:, etc is the clever static_file_path I defined.
               super(Window.MyApp, self).__init__(*args,  static_file_path={'C':'c:','c':'c:','D':'d:', 'd':'d:', 'E':'e:', 'e':'e:', 'dot':'.', '.':'.'})
How can I get the other 2 images to correctly display?

@MikeTheWatchGuy
When you setup a filename for the Image widget you don't need to speficy "url(…)" because it is an html attribute, differently when you specify a widget background you need to write "url(…)" because it is a style css property. Maybe in the future I will remove this difference.
Actually, remi server accepts only requets for paths relative to the static_file_path. However you can use the already provided SuperImage class to access resources all over the entire filesystem.
Do you need to setup a background image as for the SuperIMage widget? I can prepare a solution for this if you want. ;-)

Is there a way to pass in the "contents of a file" into an Image widget instead of a filename?
One thing I use a lot in PySimpleGUI is Base64 images.
How can I display a base64 image or an image I create in RAM / read from a file into RAM?
I continue to be all messed up with these resources but haven't had time to work on them.
What I'm trying to do is make a game for Android by animating using an Image that I change frequently.

Hello @MikeTheWatchGuy here is an example for you:
import remi.gui as gui
from remi import start, App
import remi.server

class MyApp(App):

    def main(self):
        self.main_container = gui.VBox(width=300, height=300)

        #image converted with this website: https://www.base64-image.de/encode
        self.main_container.style['background-image'] = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM4AAACqCAIAAABqGOffAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAVMSURBVHhe7dLBjeRGEAXRdWTPMlO+yAe5tFgvJAJ9SQRmh+xi8bOYHcC7zjSzfvz499dPKcDUFGJqCjE1hZiaQkxNIcul9t/ff+3Cn+gR7k8NGQ3AP9SabksNuUyBn9BS0qkhjovgR7WCXGqoIQAfoHslUkMBYfgY3eXa1LD6jfBhyrswNYy9Anyhki5JDQMvBZ+qmPmpYdoF4YOVMTk1jLosfLYCZqaGOReHj9fVpqWGIZ8CV+g6c1LDfs+CW3SRCalhucfBObrI2dQw20PhKF3hVGoY7NFwmqYbTw1TNYADNddgahipDZypiUyNcKlmGUkN2zSDYzXL26lhmJZwsqYwtS/gZE3xXmqYpDEcrvNM7Ws4XOe9kRrGaA/n6yRT+yOcr5OOpoYZPgQeQWeY2nfwCDrD1HbgHTTsUGp4/Y+Cp9AwU9uBp9AwU9uBp9Cw/dTw9B8ID6IxprYPD6IxprYPD6IxprYPD6IxpnYI3kQDdlLDi38sPIsGmNoheBYNMLVD8CwDfvzz+xPg6srUDsGzDMAkXeHqytQOwbMMwCRd4erK1A7BswzAJF3h6srUDsGzDMAkXeHqytQOwbMMwCRd4erK1A7BswzAJF3h6srUDsGzDMAkXeHqytQOwbMMwCRd4erK1A7BswzAJF3h6montQ0e/TPhTQZgkq5wdWVq+/AgYzBJV7i6MrV9eJAxmKQrXF2Z2j48yBhM0hWurkxtHx5kDCbpCldX+6lt8PQfBU8xDJN0hasrU9uBpxiGSbrC1ZWp7cBTDMMkXeHq6lBqGwzwOfAOwzBJV7i6MrXv4BHOwCRd4erK1L6DRzgDk3SFq6ujqW0wQ3s4/yRM0hWurkztj3D+SZikK1xdvZHaBmM0hsPPwyRd4erK1L6Gw8/DJF3h6uq91DaYpCWcPAUm6QpXV6b2BZw8BSbpCldXb6e2wTDN4NhZMElXuLoyNcKxs2CSrnB1NZLaBvO0gTMnwiRd4epqMLUNRmoAB86FSbrC1dV4ahtM9Wg4bTpM0hWurk6ltsFgD4WjroBJusLV1dnUNpjtiXDRFTBJV7i6MrVEZxtM0hWuriaktsF4D4JDroNJusLV1ZzUXrDi+vD9l8IkXeHqamZqG2y5LHx2ACbpCldXk1PbYNQF4YMzMElXuLqan9oG0y4FnxqDSbrC1dUlqW0w8CLwkUmYpCtcXV2V2guWvhE+LA+TdIWrq2tTe8HqYfiYu2CSrnB1lUjtBQUE4APuhUm6wtVVLrUX1HAR/OgKMElXuLpKp/aCMibCD60Dk3SFq6t7UqvQygD8wzVhkq5wdXV/ahUa+gb+cH2YpCtcXa2VWmOYpCtcXZlaCCbpCldXphaCSbrC1ZWphWCSrnB1ZWohmKQrXF2ZWggm6QpXV6YWgkm6wtWVqYVgkq5wdWVqIZikK1xdmVoIJukKV1emFoJJusLVlamFYJKucHVlaiGYpCtcXZlaCCbpCldXphaCSbrC1ZWphWCSrnB1ZWohmKQrXF2ZWggm6QpXV6YWgkm6wtWVqYVgkq5wdWVqIZikK1xdmVoIJukKV1emFoJJusLVlamFYJKucHVlaiGYpCtcXZlaCCbpCldXphaCSbrC1ZWpKcTUFGJqCjE1hZiaQkxNIaamEFNTiKkpxNQUYmoKMTWFmJpCTE0hpqYQU1OIqSnE1BRiagoxNYWYmkJMTSGmphBTU4ipKcTUFGJqCjE1hZiaQkxNIaamEFNTiKkpxNQUYmoKMTWFmJpCTE0hpqYQU1OIqSnE1BRiagoxNYWYmkJMTSGmphBTU4ipKeLXz/8BRrNcJP9b/HYAAAAASUVORK5CYII=')"
        self.main_container.style['background-repeat'] = "no-repeat"

        bt = gui.Button("a button")
        self.main_container.append(bt)

        # returning the root widget
        return self.main_container

if __name__ == "__main__":
    # starts the webserver
    start(MyApp)

You can also play sounds with base64, like in this example
import remi.gui as gui
from remi import start, App
import os

class MyApp(App):

    def main(self):
        #custom js
        my_js_head = """
            <script>
                function beep(data) {
                    var snd = new Audio(data);
                    snd.play();
                }
            </script>
            """
        self.page.children['head'].add_child('myjs', my_js_head)

        #creating a container VBox type, vertical (you can use also HBox or Widget)
        main_container = gui.VBox(width=300, height=200, style={'margin':'0px auto'})
        bt = gui.Button("play")
        bt.onclick.connect(self.on_click)
        main_container.append(bt)
        # returning the root widget
        return main_container

    def on_click(self, emitter):
        self.execute_javascript("beep('%s');"%"data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=")

if __name__ == "__main__":
    # starts the webserver
    start(MyApp)

This will help to make the game more funny :-D

Wow!  Thank you very much!!!  I'll give it a try as soon as I can.... Thank you for all the quick help!

I made a little function that will take my base64 variables and turn them into things that are passed to you:
def base64_to_style_image(base64_image):
    return "url('data:image/png;base64,"+base64_image+"')"

# using the func looks like this:
self.main_container.style['background-image'] = base64_to_style_image(my_image64)

THIS is really going to change a lot of possibilities for me!

Question:
What other types of "images" can I pass in?  Is it possible for me to not pass a filename but instead read the contents of an image file and somehow send the contents to you?  I think thinking of situations where I may "render" my own images to show an animations.
I would really like to be able to animate 2 cannons shooting arced cannon balls at each other as a simple game.
I'm trying to build a 2-play, 2-phone, Android game that people can plus using Termux and their phone.  The way  Remi works makes this a TRIVIAL thing to do because both players will automatically see the same screen.

@MikeTheWatchGuy please give me some explanations
What you mean for "type of images"?
Is it possible for me to not pass a filename but instead read the contents of an image file and somehow send the contents to you? You are not actually passing a filename, but instead the content of image, what you mean exactly?
However I suggest you to use svg elements instead of raster images. Svg elements can be animated simply, and allow better performances. I will try to provide you an example.

@MikeTheWatchGuy here is a simple example about svg elements (it uses a physical engine called pymunk http://www.pymunk.org/en/latest/ )
import remi.gui as gui
from remi import start, App
import os
import pymunk
import random

class Ball(gui.SvgCircle):
    def __init__(self, x, y, r, *args, **kwargs):
        super(Ball, self).__init__(x, y, r, *args, **kwargs)
        mass = 10
        self.body = pymunk.Body(mass, pymunk.moment_for_circle(mass, 0, r, (0, 0)))  # Create a Body with mass and moment
        self.body.position = x,y
        self.shape = pymunk.Circle(self.body, r, offset=(0, 0)) # Create a box shape and attach to body
        self.shape.elasticity = 0.95
        self.shape.friction = 0.9

    def update(self):
        self.set_position(self.body.position[0],self.body.position[1])

class GameArena(gui.Svg):
    def __init__(self, width, height, *args, **kwargs):
        super(GameArena, self).__init__(width, height, *args, **kwargs)
        self.space = pymunk.Space()
        self.space.gravity = 0,1000

        #ground
        self.ground_body = pymunk.Body(body_type=pymunk.Body.STATIC)
        self.ground_shape = pymunk.Segment(self.ground_body, (0,height), (width,height), 0.0)
        self.ground_shape.friction = 0.9
        self.ground_shape.elasticity = 0.95
        self.space.add(self.ground_shape)

    def add_element(self, element):
        self.space.add(element.body, element.shape)
        return self.append(element)

    def time_tick(self):
        self.space.step(0.01)
        for e in self.children.values():
            e.update()

class MyApp(App):
    def idle(self):
        self.game_arena.time_tick()

    def main(self):
        #creating a container VBox type, vertical (you can use also HBox or Widget)
        main_container = gui.VBox(style={'margin':'0px auto'})

        self.game_arena = GameArena(400,400)
        for i in range(1,100):
            x = random.randint(100,300)
            y = random.randint(100,300)
            r = random.randint(10,20)
            self.ball = Ball(x,y,r)
            self.game_arena.add_element(self.ball)
        main_container.append(self.game_arena)

        # returning the root widget
        return main_container

if __name__ == "__main__":
    # starts the webserver
    start(MyApp, address='<IP_ADDRESS>', port=0, start_browser=True, update_interval=0.01 )

funny, doesn't it? I can help you making something complex, a 2 player game

You are FULL-ON CRAZY!
I need to see if pymunk will install on Android using termux.   That's the ultimate platform I'm writing this for.  I want to make not just an Android app, but one that 2 people could play and have some fun with. It's a great way to show off these Remi capabilities!

@MikeTheWatchGuy Which kind of game you have in mind?
Ideas:

tanks shooting
pinball
soldiers shooting

Why limiting to two users? You can consider N unlimited users

I was thinking of the classic 2 stationary cannons that shoot balls in an arc.  You can control the angle and thrust  (use up/down buttons).  This way the only thing that's moving is the balls. I was thinking I could render them in a way that I can show in my Image Element, animating by simply showing frame by frame.
I suppose it could also be done using lines of text :-)  Shooting *'s that arc using lines of text, old school style.

@MikeTheWatchGuy Why you don't implement Svg widgets in PySimpleGUIWeb? It would allow much better animations, and easier game development.
Maybe you don't want to do it beacuse not all gui libraries supports Svg? Consider this would be a plus for PySimpleGUI respect to other libraries.

I'll look into it.  Maybe it would be good as my "Graph Element".  For that element, I supply drawing primitives like lines, circles, rectangles, and images too.  In tkinter they're done using "Canvas Widgets".
Is the Svg Widget similar to a Canvas or other "Drawing" type of widget?

Svg widget is a container for graphical primitives, lines, circles, rectangles, polygons, text and also raster images. Svg elements are like standard widgets, they can generate events like a button. And so you can make interactive games, you can catch the click on a circle for example. Svg elements can be  moved and updated in color and other attributes.
Implementing svg you can embed pygal library to make powerful graphs.

Ah!  This sounds exactly like my Graph Element.  Perfect!  It's the element I use to make games with as I can show images inside the element along with text and other graphic elements.
I'll get to work on it right away.
I made graphs in PySimpleGUI using Matplotlib and Canvas widgets (same as my Graph elements)
I haven't tried pygal with PySimpleGUI before.
I'll work on getting my Graph element up to the point I can draw images and / or figures on it.

I implemented your Svg as my Graph Element.  It's a perfect match to what my Graph Element's interfaces are like.
Here's the PySimpleGUI code and what it makes.
Need to add image, rectangles still.
import PySimpleGUIWeb as sg

layout = [  [sg.Text('Line Test', tooltip='Tips')],
            [sg.Graph((200,200), (0,0), (200,200), enable_events=True, key='_GRAPH_')],
            [sg.Button('Exit')]]

window = sg.Window('Window Title', layout,)

while True:             # Event Loop
    event, values = window.Read()
    print(event, values)
    if event in (None, 'Exit'):
        break
    window.Element('_GRAPH_').DrawLine((0,0), (100,100), color='red')
    window.Element('_GRAPH_').DrawLine((200,200), (100,100), color='black')
    window.Element('_GRAPH_').DrawPoint((10,150), 2, color='green')
    window.Element('_GRAPH_').DrawCircle((55,75), 30, fill_color='purple')
    window.Element('_GRAPH_').DrawText('this is my text!',(100,100))

window.Close()

How do I move a figure in a way that deletes the previous location?
For example, I'm able to move the text in my figure from one place to another by calling .set_position, but it leaves a copy of the original still showing.

I'm trying to add Images now as a drawing primitive.  I've got lines, rectangles, etc.  But I don't see an SvgImage object.
I tried to add an image this way:
        rpoint = remi.gui.Svg(size[0], size[1])
        rpoint.style['background-image'] = image

How do I move a figure in a way that deletes the previous location?
For example, I'm able to move the text in my figure from one place to another by calling .set_position, but it leaves a copy of the original still showing.

@MikeTheWatchGuy set_position is the right method to move an svg element. You see that a copy of text remains in the old position because maybe there is a copy of it in that position. I mean that, probably, you are adding the same element multiple times (in the while loop in your example) and you are calling set_position for only one instance of them. Is this correct?
In order to add a raster image to an svg element, you simply need to create a standard Image widget and append it to the svg widget ;-)

Oh crap!  I think you're right. I'm re-drawing!
Thanks for the Image tip!
Getting closer!

I was stunned to see that my Demo Program that draws sine waves works perfectly with these new changes!  The same code is running on tkinter, Qt, and Remi and makes similar looking graphs.      As soon as I get Images to work, I'll be able to run the Uno game in a browser!

Here is an example using pygal https://github.com/dddomodossola/remi/issues/243
Now I go to sleep. Have a good development @MikeTheWatchGuy

Can you tell me how to put a Base64 Image into an Image widget?  It only takes filenames and I'm unsure how to do it other than writing as a temp file.  You supplied a base64 above, but it was for a background image.  I'll experiment.  Maybe I just need to set the Image's background image?

I only just now implemented the SuperImage class.  Sorry it took SO long for me to add.
It seems to be working great for my normal images, but I'm struggling a little in placing the image inside the Svg widget at the correct location.  I don't see where I can add the location to my code.
With other things that I draw like lines or circles, there's a place to put the location.  Here's my latest attempt.  It IS drawing an image, but it is outside of the Svd
    def DrawImage(self, image_source=None, location=(None, None), size=(100, 100), color='black', font=None, angle=0):
        if location == (None, None):
            return
        # if type(image_source) is bytes:
        #     image = base64_to_style_image(image_source)
        # else:
        # image = "url('{}')".format('/'+image_source)
        converted_point = self._convert_xy_to_canvas_xy(location[0], location[1])
        if self.Widget is None:
            print('*** WARNING - The Graph element has not been finalized and cannot be drawn upon ***')
            print('Call Window.Finalize() prior to this operation')
            return None
        image_widget = SuperImage(image_source)
        image_widget.attributes['x'] = converted_point[0]
        image_widget.attributes['y'] = converted_point[1]
        # image_widget.style['background-repeat'] = 'no-repeat'
        self.Widget.append([image_widget,])

Here you can see that the image is outside of the light blue Svg box.

And here's a repl.it that has my code and the demo program.
https://repl.it/@PySimpleGUI/Drawing-Primitives-using-Remis-Svg-Widget
If you click the Draw button, it'll draw a bunch of stuff in the blue box.
If you click Image, it's supposed to draw the image inside of the blue box, but instead it's to the right of the box.

Here's my "Draw Image" code.
No matter what I try, the image is always added to the right of the Svg light blue square.  I want it to be drawn inside the square.
    def DrawImage(self, image_source=None, location=(None, None), size=(100, 100), color='black', font=None, angle=0):
        if location == (None, None):
            return
        # if type(image_source) is bytes:
        #     image = base64_to_style_image(image_source)
        # else:
        # image = "url('{}')".format('/'+image_source)
        converted_point = self._convert_xy_to_canvas_xy(location[0], location[1])
        if self.Widget is None:
            print('*** WARNING - The Graph element has not been finalized and cannot be drawn upon ***')
            print('Call Window.Finalize() prior to this operation')
            return None
        image_widget = SuperImage(image_source)
        shape = remi.gui.SvgShape(converted_point[0], converted_point[1])
        shape.append([image_widget,])
        self.Widget.append([shape,])

@MikeTheWatchGuy I told you something wrong. You can't use the standard Image widget within an Svg element. However you can use the new SvgImage. I created it today. You can find it on the master branch.
In order to set an Image from base64 data instead of filename you can pass the base64 data to the constructor or the set_image function instead of the filename.
ie.
myimage.set_image("data:image/png;base64,iVBORw0KGgoAAA...") #data is truncated, this is not a valid base64 data, it's just an example

or
myimage = gui.Image("data:image/png;base64,iVBORw0KGgoAAA....") #data is truncated, this is not a valid base64 data, it's just an example

I've only pip installed Remi so far.
I have a copy of the GitHub on my hard disk.
Can you tell me what I need to do to "install" the GitHub file I just downloaded?
(Sorry, with PySimpleGUI it's a single .py file so I'm not used to working with real packages)

No problem, here is the solution.
If you downloaded the source code you can do:
python setup.py install

if you want to install directly from GitHub you can do:
pip install git+https://github.com/dddomodossola/remi.git

WOW, that's GREAT STUFF!!

I'm using your SuperImage class.  I'll see how to apply your base64 info to that.
I think my problem now is back at how to correctly create that weird formatted string that gets passed to SvgImage.
I work in the world of filenames and base64 variable names.   This other stuff is super-confusing to me as I'm not from this web world.
I was able to see that something attempted to be drawn in my space, so now I just gotta get the image source thing done right.

By the way, I added base64 to super image by hacking up the load routing:
class SuperImage(remi.gui.Image):
    def __init__(self, file_path_name=None, **kwargs):
        image = file_path_name
        super(SuperImage, self).__init__(image, **kwargs)

        self.imagedata = None
        self.mimetype = None
        self.encoding = None
        self.load(image)

    def load(self, file_path_name):
        if type(file_path_name) is bytes or len(file_path_name) > 200:
            self.imagedata = base64.b64decode(file_path_name)
        else:
            self.mimetype, self.encoding = mimetypes.guess_type(file_path_name)
            with open(file_path_name, 'rb') as f:
                self.imagedata = f.read()
        self.refresh()

    def refresh(self):
        i = int(time.time() * 1e6)
        self.attributes['src'] = "/%s/get_image_data?update_index=%d" % (id(self), i)

    def get_image_data(self, update_index):
        headers = {'Content-type': self.mimetype if self.mimetype else 'application/octet-stream'}
        return [self.imagedata, headers]

What I need is something that will convert from a normal filename into that funny formatted string.  Or from a base64 variable to one of those strings.
I think this is what you did in the get_image_data function.

Yea, all of my problems center around what to pass in.  I can't seem to form the right format string to display my image.
My image is simply here:
'C:\Python\PycharmProjects\GooeyGUI\logo200.png'
My program currently does this:

The logo that's shown at the top of the page is what I'm attempting to show inside of the blue box.

Check this out!!!!!
https://repl.it/@PySimpleGUI/Bouncing-Balls
I'm finally catching up with stuff you had running long ago.
Our code is about the same number of lines of code.

Well done @MikeTheWatchGuy !
you should encode the file content instead of the filename.
ie.
myimage_widget.set_image("data:image/svg+xml;base64,%s"%base64.b64encode(image_file_content))

egads!  How can I learn these strings you're building?
Is there a way for me to make a function that will build them for me from either a base64 string or a filename or contents of a file?
I'm expecting to use this code to attempt animations so the extra encode worries me a tad.
Thanks for the fast reply!!!

Here is my DrawImage method:
    def DrawImage(self, image_source=None, location=(None, None), size=(100, 100), color='black', font=None, angle=0):
        if location == (None, None):
            return
        # if type(image_source) is bytes:
        #     image = base64_to_style_image(image_source)
        # else:
        # image = "url('{}')".format('/'+image_source)
        converted_point = self._convert_xy_to_canvas_xy(location[0], location[1])
        if self.Widget is None:
            print('*** WARNING - The Graph element has not been finalized and cannot be drawn upon ***')
            print('Call Window.Finalize() prior to this operation')
            return None

        rpoint = remi.gui.SvgImage(image_source, converted_point[0], converted_point[0], size[0], size[1])
        if type(image_source) is bytes or len(image_source) > 200:
            rpoint.set_image("data:image/svg+xml;base64,%s"%image_source)
        else:
            with open(image_source, 'rb') as f:
                data = f.read()
            print(data)
            rpoint.set_image("data:image/svg+xml;base64,%s"% base64.b64encode(data))
        # rpoint.set_image(image_source)
        self.SvgGroup.append([rpoint,])

I'm getting an error now for my Graph Element when I try to call set_image.  set_image is no longer a valid method evidently as I get this error:
Traceback (most recent call last):
  File "C:/Users/mike/.PyCharmCE2019.1/config/scratches/scratch_948.py", line 16, in <module>
    graph.draw_image(image_source=r'C:\Python\PycharmProjects\GooeyGUI\logo200.png', location=(0,500))
  File "C:\Python\PycharmProjects\GooeyGUI\PySimpleGUIWeb.py", line 1757, in DrawImage
    rpoint.set_image(image_string)
AttributeError: 'SvgImage' object has no attribute 'set_image'

What method should I be calling now?
PyCharm isn't showing me anything similar to set_image when I look at what's available to an SvgImage object.
Here's a small program that I'm using to try to draw an image on my Graph Element.
import PySimpleGUIWeb as sg

graph = sg.Graph((600,600), (0,0), (600,600), key='-G-')

layout = [  [sg.Text('My Window')],
            [graph],
            [sg.Input(key='-IN-'), sg.Text(size=(12,1), key='-OUT-')],
            [sg.Button('Go'), sg.Button('Exit')]  ]

window = sg.Window('Window Title', layout)

while True:             # Event Loop
    event, values = window.read()
    print(event, values)
    if event == sg.WIN_CLOSED or event == 'Exit':
        break
    if event == 'Go':
        graph.draw_image(image_source=r'C:\Python\PycharmProjects\GooeyGUI\logo200.png', location=(0,500))
window.close()

Oh oh!
I figured it out!  It's an assignment now:
            rpoint.image_data = "data:image/svg;base64,%s"%image_source

The problem I have now is the images I use are byte-strings.  If I try and draw using the byte-string it fails with a generic icon being shown.

But if I remove the "b" from the byte-string variable so that it's just a string, then it draws correctly.

Here's the code with the "b" that when changed draws correctly.  I'm attaching my PySimpleGUIWeb.py file that has the changes to make the draw into an assignment.
import PySimpleGUIWeb as sg

ICON_BASE64_BLOB_HEADACHE = b'[encoded data, 31372 characters]'

graph = sg.Graph((600,600), (0,0), (600,600), key='-G-')

layout = [  [sg.Text('My Window')],
            [graph],
            [sg.Input(key='-IN-'), sg.Text(size=(12,1), key='-OUT-')],
            [sg.Button('Go'), sg.Button('Exit')]  ]

window = sg.Window('Window Title', layout)

while True:             # Event Loop
    event, values = window.read()
    print(event, values)
    if event == sg.WIN_CLOSED or event == 'Exit':
        break
    if event == 'Go':
        graph.draw_image(image_source=ICON_BASE64_BLOB_HEADACHE, location=(200,500))
window.close()

PySimpleGUIWeb.py.txt


[🐴] NUX

Appears based on the presence of the chat declaration record. Sets it to following as soon as it appears, and lets you change it in the dialog.
Placed in the messages list, so you'll see it the first time you click on the Chat tab

Unlikely this is related to this PR, but the first option has this highlighting by default on chrome


Adding to the "Logs" tab of a custom component.

Feature Request
Hello, when writing a custom component (or modifying an existing one for that matter) -- I can't figure out how to add to the "Logs" tab of the output port. What library should I be using?
Motivation
Need to log some debug data.
Your Contribution
No response

You can write into the output logs tab by using self.log(message, name).
from langflow.custom import Component
from langflow.io import MessageTextInput, Output
from langflow.schema import Data

class CustomComponent(Component):
    display_name = "Custom Component"
    description = "Use as a template to create your own component."
    documentation: str = "http://docs.langflow.org/components/custom"
    icon = "code"
    name = "CustomComponent"

    inputs = [
        MessageTextInput(
            name="input_value",
            display_name="Input Value",
            info="This is a custom component Input",
            value="Hello, World!",
            tool_mode=True,
        ),
    ]

    outputs = [
        Output(display_name="Output", name="output", method="build_output"),
    ]

    def build_output(self) -> Data:
        data = Data(value=self.input_value)
        self.status = data
        self.log("Building output", "my-logging-name")
        return data


fix: correct properties for TaskUpdate

this one is getting stale, can someone more informed than me review this please? maybe @valekjo?

The editable properties are:
export const ACTOR_TASK_EDITABLE_FIELDS = ['description', 'input', 'name', 'title', 'options'];

So this is ok, unless we're aiming to make it complete (I'm not sure if we're planning to keep the api docs like this).

not sure if the openapi specs are more up to date or they need the same fix (https://docs.apify.com/api/v2-new#tag/Actor-tasks/operation/Updatetask)


Mac Virtual machine has skewed view for any downloaded apps

I am using a Mac virtual machine in UTM, and native apps are working fine, but if I try to download chrome or visual studio code, the view is skewed (see screenshots). In Chrome, the "x" button in the tap shows up as a square and most of the other icons are also appearing incorrectly. Visual studio code is not even usable because of how skewed it is
Any ideas how to resolve this?

Configuration

UTM Version: 3.1.5
OS Version: 12.0.1
Intel or Apple Silicon? Silicon

See this issue, looks the same: #3692

Duplicate of #3692


No JSX support

Environment:

OS
Vim (:version)
Terminal

If you have a trouble with coloration and are using Vim/Neovim with terminal:

[x] Does your Vim support full colors? (:set termguicolors)
[x] Does your terminal support full colors? (e.g. Terminal.app doesn't support it)

Other colorschemes I have tried support JSX, but it seems iceberg doesn't..

I have same issue.

Theme on image is not iceberg, but here we can see how TS defines JSX tags.

TSConstructor and TSVariable both set to icebergNormalFg, so all tags in JSX are white.
When I comment those two lines in iceberg.vim, JSX tags get green color:
hi! link TSConstructor icebergNormalFg hi! link TSVariable icebergNormalFg
Properties in JSX tags (TSProperty) are set to TSField, TSField again to icebergNormalFg, which again makes them all white:
hi! link TSField icebergNormalFg hi! link TSProperty TSField

@cocopon will you have time to bring TreeSitter highlighting to working condition?

Okay, I'm looking into the issue... First, what is the file type of the buffer? It seems that the file extension of the file is js, not jsx.
I have tried a small code with the name foobar.jsx (:echo &ft returns javascript.jsx) and it seems to work fine:

:TSHighlightCapturesUnderCursor:

You are using just HTML tags, which are parsed better:

JSX tags have additional highlights groups:

BTW: on this and also on your's screenshot you may see another problem. I believe NormalFloat highlights is set wrong, so we have that black box around the floating window. If you select this box (I just select it with my mouse), you will see borders.
When you compare how typescript code is looking on screenshots from colorswat.ch, you also see some differences. On those old screenshots, I see that functions have orange and some other parts also have different colors.  But with Treesitter there is really a lot of white color. :)

You are using just HTML tags, which are parsed better:

The original issue by @patchworkCode contains HTML tags. Your issue seems a bit different.

hi! link TSConstructor icebergNormalFg
hi! link TSVariable icebergNormalFg

These links are intentional. One of the concept of Iceberg is: don't get fancy, focusing few important things. I think that the white color is good for user-defined tags because this is a kind of variable.

Anyway it's good to add highlighting for tag attributes, so added it in 5ac9da61e8626d1218498a35e515f36387efe454:

I'm not sure whether things have been updated as I use another theme now, however my image is an example of JavaScript react which when I was iceberg before would be rendered as plaintext.

@patchworkCode have you Treesitter installed and tsserver for it?

These links are intentional. One of the concept of Iceberg is: don't get fancy, focusing few important things. I think that the white color is good for user-defined tags because this is a kind of variable.

I am slightly bothered about the difference I experience between editors. Not trying to change your conscious decision here, I'd just love to see consistency 👍.
Here are some screenshots when using the filetype typescriptreact:
VSCode:

Neovim (treesitter + tsserver) - Highlight enabled:

Neovim (treesitter + tsserver) - Highlight disabled:


chore: veANC - update voting escrow docs

Summary of changes

Updates docs for voting_escrow contract

Report of required housekeeping

[ ] Github issue OR spec proposal link
[ ] Wrote tests
[ ] Added a relevant changelog entry to CHANGELOG.md

(FOR ADMIN) Before merging

[ ] Added appropriate labels to PR
[ ] Squashed all commits, uses message "Merge pull request #XYZ: [title]" (coding standards)
[ ] Confirm added tests are consistent with the intended behavior of changes
[ ] Ensure all tests pass

 veANC - Documentation

The first paragraph says Maximum lock time is 2 years which equals to 2.5 coefficient. For example, if the user locks 100 ANC for 2 years he gains 250 voting power, we should change the 2 years into 4 years.

The first paragraph says Maximum lock time is 2 years which equals to 2.5 coefficient. For example, if the user locks 100 ANC for 2 years he gains 250 voting power, we should change the 2 years into 4 years.

addressed!


how to manually cancel an upload using abort

Continuation from https://github.com/alovajs/alova/issues/138#issuecomment-1615837125
What I'm trying to do give the user the ability to cancel an upload by clicking on a 'cancel' button. With axios I was using AbortController() and with my port to Alova now trying to find something similar. I first thought of using the abort function in the useRequest as per the example in https://alova.js.org/learning/use-request/#abort-request-manually but this didn't seem to work and I don't want to add it to the createAlova instance via method.abort is this is specific to one use case.
I'm not sure it's a bug - shall I create an issue, create a discussion or leave it here?
https://codesandbox.io/p/sandbox/alova-test-upload-w46x26
thanks again for this great library!

:tada: This issue has been resolved in version 2.9.0 :tada:
The release is available on:

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket:

Thanks! I'll check....

OK. fixed it just now.
upgrade to v2.9.0 to check it.

just did, works great. A thousand thanks....!

and now. v2.9.0, In react, the send and abort functions are wrapped with useCallback, and they are not limited by the closure trap. You can use it directly in the event without worrying about performance problems.

I've been testing and found that the first Cancel works but any other abort calls are ignored.
You can reproduce at the codesandbox https://codesandbox.io/p/sandbox/alova-test-upload-w46x26
Upload a file, hit cancel, it aborts nicely. Now try and upload again and hit cancel and it doesn't work.

@proddy 😂I overlooked something, let me think of a way first.

@proddy Now it is fixed. I promise.😂

great, I'll check now.

great, I'll check now.

works! 🎉


modify lmax and lloc for H atom in the C2H2 example

When Prof. Yabana generated H_rps.dat, he wrote a column of l=1 in the file because he intended to calculate nonlocal term. So I modify input files to follow Prof. Yabana's idea.

Jenkins: Automatic build-test is triggered.

Jenkins: Automatic build-test is started.

Build is failure.

Oscillator Strength (z-direction, 9.28eV) calculated by jenkins is 1.208188e+00, while it on k-computer is 1.216666e+00. I'll consider how to fix this problem.

I think it's difficult to solve this problem in two days, so I decline this PR. I might give this PR again.


Name of reference returns a 404 when trying to submit a new reference

The error returned is due to a problem on the API side; the ticket #43 has been created and is waiting to be merged

fixed in backend: https://github.com/Refemi/refemi_api/pull/44


Socket Thread Safety

Is the created socket thread safe? Can I initialize and open just a single one in my app or do I have to open a new socket everytime in my http handler?
Thanks

Yes, if you use the documented APIs, then its thread safe.


server,config: respect storage.max.volume.size and make it dynamic

Description
Fixes #5830

Config - storage.max.volume.size is made dynamic.
Enforced config during deployVM, volume creation and volume resize.

Types of changes

[ ] Breaking change (fix or feature that would cause existing functionality to change)
[ ] New feature (non-breaking change which adds functionality)
[x] Bug fix (non-breaking change which fixes an issue)
[ ] Enhancement (improves an existing feature and functionality)
[ ] Cleanup (Code refactoring and cleanup, that may add test cases)

Feature/Enhancement Scale or Bug Severity
Feature/Enhancement Scale

[ ] Major
[ ] Minor

Bug Severity

[ ] BLOCKER
[ ] Critical
[ ] Major
[ ] Minor
[ ] Trivial

Screenshots (if appropriate):
How Has This Been Tested?

Using cmk while setting the config value to 15gb and then trying different operations deploy VM, create volume, resize volume over and within this limit.
Update storage.max.volume.size to 15
(local) 🦌 > list configurations name=storage.max.volume.size
{
  "configuration": [
    {
      "category": "Storage",
      "description": "The maximum size for a volume (in GB).",
      "isdynamic": true,
      "name": "storage.max.volume.size",
      "value": "2000"
    }
  ],
  "count": 1
}
(local) 🐑 > update configuration name=storage.max.volume.size value=15
{
  "configuration": {
    "category": "Storage",
    "description": "The maximum size for a volume (in GB).",
    "isdynamic": true,
    "name": "storage.max.volume.size",
    "value": "15"
  }
}
(local) 🐌 > set username user
(local) 🐌 > sync
Discovered 281 APIs

Operations failing with volume size over 15gb
(local) 🐠 > deploy virtualmachine zoneid=4fa5009b-36e0-4495-906e-e1668d89332c templateid=b67dc437-79c3-11ec-a92e-645d8651f45a rootdisksize=20 startvm=true serviceofferingid=4c01b261-3dfa-4e63-9860-ea506dafd78b iptonetworklist[0].networkid=55073eca-1107-4b0e-b309-e28ed821ae79
🙈 Error: (HTTP 431, error code 4350) Requested volume size is<PHONE_NUMBER>0, but the maximum size allowed is 15 GB.
(local) 🐈 > list diskofferings filter=name,id,disksize,
{
  "count": 5,
  "diskoffering": [
    {
      "disksize": 5,
      "id": "eed0dc90-d3ab-4793-b71f-e5a0d09da670",
      "name": "Small"
    },
    {
      "disksize": 20,
      "id": "9294a4f0-4731-4550-9b53-362dcd01b1a4",
      "name": "Medium"
    },
    {
      "disksize": 100,
      "id": "c0586e94-3bda-4bda-99b6-ff174e70e2df",
      "name": "Large"
    },
    {
      "disksize": 0,
      "id": "8b5de680-d3c2-4913-bcb7-ee5e0b9b426b",
      "name": "Custom"
    },
    {
      "disksize": 15,
      "id": "714d2b73-38d8-4ce4-994a-5195f6dcc4a2",
      "name": "15gb"
    }
  ]
}
(local) 🐶 > create volume zoneid=4fa5009b-36e0-4495-906e-e1668d89332c diskofferingid=9294a4f0-4731-4550-9b53-362dcd01b1a4 name=v1
🙈 Error: (HTTP 431, error code 4350) Requested volume size is<PHONE_NUMBER>0, but the maximum size allowed is 15 GB.
(local) 🐝 > create volume zoneid=4fa5009b-36e0-4495-906e-e1668d89332c diskofferingid=eed0dc90-d3ab-4793-b71f-e5a0d09da670  name=v1
{
  "volume": {
    "account": "user",
    "created": "2022-01-20T13:43:06+0530",
    "destroyed": false,
    "diskofferingdisplaytext": "Small Disk, 5 GB",
    "diskofferingid": "eed0dc90-d3ab-4793-b71f-e5a0d09da670",
    "diskofferingname": "Small",
    "domain": "ROOT",
    "domainid": "76250dec-79c3-11ec-a92e-645d8651f45a",
    "hasannotations": false,
    "id": "8a373941-6d28-408f-b004-b66da1e523ab",
    "isextractable": true,
    "jobid": "dce82ab2-0f11-4379-aa50-0a67f174c8cb",
    "jobstatus": 0,
    "name": "v1",
    "provisioningtype": "thin",
    "quiescevm": false,
    "size":<PHONE_NUMBER>,
    "state": "Allocated",
    "supportsstoragesnapshot": false,
    "tags": [],
    "type": "DATADISK",
    "zoneid": "4fa5009b-36e0-4495-906e-e1668d89332c",
    "zonename": "Sandbox-simulator"
  }
}
(local) 🐻 > resize volume id=8a373941-6d28-408f-b004-b66da1e523ab diskofferingid=9294a4f0-4731-4550-9b53-362dcd01b1a4
{
  "accountid": "b4c59d24-4340-46ac-b576-8de5fc0524cf",
  "cmd": "org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd",
  "completed": "2022-01-20T13:43:22+0530",
  "created": "2022-01-20T13:43:22+0530",
  "jobid": "44fc3383-63ca-4207-b6dc-f1a9b63a43c5",
  "jobprocstatus": 0,
  "jobresult": {
    "errorcode": 432,
    "errortext": "Requested volume size is<PHONE_NUMBER>0, but the maximum size allowed is 15 GB."
  },
  "jobresultcode": 530,
  "jobresulttype": "object",
  "jobstatus": 2,
  "userid": "ab94c245-67ab-45c5-a08b-ddcf506072ed"
}
🙈 Error: async API failed for job 44fc3383-63ca-4207-b6dc-f1a9b63a43c5

Operations working with volume size less than or equal to 15gb
(local) 🐡 > deploy virtualmachine zoneid=4fa5009b-36e0-4495-906e-e1668d89332c templateid=b67dc437-79c3-11ec-a92e-645d8651f45a rootdisksize=15 startvm=true serviceofferingid=4c01b261-3dfa-4e63-9860-ea506dafd78b iptonetworklist[0].networkid=55073eca-1107-4b0e-b309-e28ed821ae79
{
  "virtualmachine": {
    "account": "user",
    "affinitygroup": [],
    "cpunumber": 1,
    "cpuspeed": 500,
    "created": "2022-01-20T13:44:02+0530",
    "details": {},
    "displayname": "VM-529d0073-4402-41df-9b02-0313b3ff5293",
    "domain": "ROOT",
    "domainid": "76250dec-79c3-11ec-a92e-645d8651f45a",
    "guestosid": "76176d58-79c3-11ec-a92e-645d8651f45a",
    "haenable": false,
    "hasannotations": false,
    "hypervisor": "Simulator",
    "id": "529d0073-4402-41df-9b02-0313b3ff5293",
    "isdynamicallyscalable": false,
    "jobid": "3643b7db-9124-4a68-8fb6-2b65f0ec5ba0",
    "jobstatus": 0,
    "lastupdated": "2022-01-20T13:44:05+0530",
    "memory": 512,
    "name": "VM-529d0073-4402-41df-9b02-0313b3ff5293",
    "nic": [
      {
        "broadcasturi": "vlan://128",
        "deviceid": "0",
        "extradhcpoption": [],
        "gateway": "<IP_ADDRESS>",
        "id": "c220b4c6-ff2a-4caf-8097-686f3eee5ac8",
        "ipaddress": "<IP_ADDRESS>",
        "isdefault": true,
        "isolationuri": "vlan://128",
        "macaddress": "02:00:4d:ab:00:01",
        "netmask": "<IP_ADDRESS>",
        "networkid": "55073eca-1107-4b0e-b309-e28ed821ae79",
        "networkname": "test",
        "secondaryip": [],
        "traffictype": "Guest",
        "type": "Isolated"
      }
    ],
    "osdisplayname": "CentOS 5.6 (64-bit)",
    "ostypeid": "76176d58-79c3-11ec-a92e-645d8651f45a",
    "passwordenabled": false,
    "pooltype": "NetworkFilesystem",
    "readonlydetails": "dataDiskController, rootDiskController",
    "receivedbytes": 0,
    "rootdeviceid": 0,
    "rootdevicetype": "ROOT",
    "securitygroup": [],
    "sentbytes": 0,
    "serviceofferingid": "4c01b261-3dfa-4e63-9860-ea506dafd78b",
    "serviceofferingname": "Small Instance",
    "state": "Running",
    "tags": [],
    "templatedisplaytext": "CentOS 5.6 (64-bit) no GUI (Simulator)",
    "templateid": "b67dc437-79c3-11ec-a92e-645d8651f45a",
    "templatename": "CentOS 5.6 (64-bit) no GUI (Simulator)",
    "userid": "ab94c245-67ab-45c5-a08b-ddcf506072ed",
    "username": "user",
    "zoneid": "4fa5009b-36e0-4495-906e-e1668d89332c",
    "zonename": "Sandbox-simulator"
  }
}
(local) 🐇 > create volume zoneid=4fa5009b-36e0-4495-906e-e1668d89332c diskofferingid=714d2b73-38d8-4ce4-994a-5195f6dcc4a2  name=v2
{
  "volume": {
    "account": "user",
    "created": "2022-01-20T13:44:22+0530",
    "destroyed": false,
    "diskofferingdisplaytext": "15gb",
    "diskofferingid": "714d2b73-38d8-4ce4-994a-5195f6dcc4a2",
    "diskofferingname": "15gb",
    "domain": "ROOT",
    "domainid": "76250dec-79c3-11ec-a92e-645d8651f45a",
    "hasannotations": false,
    "id": "3322c16c-95d9-4b6b-8024-25663138aa1b",
    "isextractable": true,
    "jobid": "39891090-e510-44f4-95ef-6dbe65dd40e9",
    "jobstatus": 0,
    "name": "v2",
    "provisioningtype": "thin",
    "quiescevm": false,
    "size":<PHONE_NUMBER>0,
    "state": "Allocated",
    "supportsstoragesnapshot": false,
    "tags": [],
    "type": "DATADISK",
    "zoneid": "4fa5009b-36e0-4495-906e-e1668d89332c",
    "zonename": "Sandbox-simulator"
  }
}
(local) 🐍 > resize volume id=8a373941-6d28-408f-b004-b66da1e523ab diskofferingid=714d2b73-38d8-4ce4-994a-5195f6dcc4a2
{
  "volume": {
    "account": "user",
    "created": "2022-01-20T13:43:06+0530",
    "destroyed": false,
    "diskofferingdisplaytext": "15gb",
    "diskofferingid": "714d2b73-38d8-4ce4-994a-5195f6dcc4a2",
    "diskofferingname": "15gb",
    "domain": "ROOT",
    "domainid": "76250dec-79c3-11ec-a92e-645d8651f45a",
    "hasannotations": false,
    "id": "8a373941-6d28-408f-b004-b66da1e523ab",
    "isextractable": true,
    "name": "v1",
    "provisioningtype": "thin",
    "quiescevm": false,
    "size":<PHONE_NUMBER>0,
    "state": "Allocated",
    "supportsstoragesnapshot": false,
    "tags": [],
    "type": "DATADISK",
    "zoneid": "4fa5009b-36e0-4495-906e-e1668d89332c",
    "zonename": "Sandbox-simulator"
  }
}

@harikrishna-patnala I've made changes and ensured the config is respected during VM deployment, volume creation and volume resize. Also, to fix its dynamic behaviour.
Currently, the config affects even root admin vm and volume deployment. Also, I've purposefully not included check for root disk size when it is taken directly from the template. Can you please have an initial look at the changes

@blueorangutan package

@shwstppr a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

Packaging result: :heavy_check_mark: el7 :heavy_check_mark: el8 :heavy_check_mark: debian :heavy_check_mark: suse15. SL-JID 2248

Add test details in description

@blueorangutan test

@sureshanaparti a Trillian-Jenkins test job (centos7 mgmt + kvm-centos7) has been kicked to run smoke tests

Can you rebase to solve the conflicts,  @shwstppr  ?

@blueorangutan package

@shwstppr a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

Packaging result: :heavy_check_mark: el7 :heavy_check_mark: el8 :heavy_check_mark: debian :heavy_check_mark: suse15. SL-JID 2265

@blueorangutan test

Trillian test result (tid-2928)
Environment: kvm-centos7 (x2), Advanced Networking with Mgmt server 7
Total time taken: 31327 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr5857-t2928-kvm-centos7.zip
Smoke tests completed. 91 look OK, 1 have errors
Only failed tests results shown below:

Test
Result
Time (s)
Test File

test_08_arping_in_ssvm
Failure
5.16
test_diagnostics.py

@blueorangutan package

@sureshanaparti a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

Packaging result: :heavy_check_mark: el7 :heavy_check_mark: el8 :heavy_check_mark: debian :heavy_check_mark: suse15. SL-JID 2406

@blueorangutan test keepEnv

@DaanHoogland a Trillian-Jenkins test job (centos7 mgmt + kvm-centos7) has been kicked to run smoke tests

Trillian test result (tid-3081)
Environment: kvm-centos7 (x2), Advanced Networking with Mgmt server 7
Total time taken: 28000 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr5857-t3081-kvm-centos7.zip
Smoke tests completed. 80 look OK, 12 have errors
Only failed tests results shown below:

Test
Result
Time (s)
Test File

test_01_invalid_upgrade_kubernetes_cluster
Failure
3.42
test_kubernetes_clusters.py

test_02_upgrade_kubernetes_cluster
Failure
4.42
test_kubernetes_clusters.py

test_03_deploy_and_scale_kubernetes_cluster
Failure
4.33
test_kubernetes_clusters.py

test_04_autoscale_kubernetes_cluster
Failure
3.31
test_kubernetes_clusters.py

test_05_basic_lifecycle_kubernetes_cluster
Failure
4.34
test_kubernetes_clusters.py

test_06_delete_kubernetes_cluster
Failure
4.29
test_kubernetes_clusters.py

test_07_deploy_kubernetes_ha_cluster
Failure
3.22
test_kubernetes_clusters.py

test_08_upgrade_kubernetes_ha_cluster
Failure
4.24
test_kubernetes_clusters.py

test_09_delete_kubernetes_ha_cluster
Failure
4.35
test_kubernetes_clusters.py

ContextSuite context=TestKubernetesCluster>:teardown
Error
63.51
test_kubernetes_clusters.py

test_01_native_to_native_network_migration
Error
10.11
test_migration.py

test_02_native_to_native_vpc_migration
Error
6.80
test_migration.py

ContextSuite context=TestListIdsParams>:setup
Error
0.00
test_list_ids_parameter.py

test_delete_account
Error
16.85
test_network.py

test_delete_network_while_vm_on_it
Error
2.27
test_network.py

test_delete_network_while_vm_on_it
Error
2.28
test_network.py

test_deploy_vm_l2network
Error
2.27
test_network.py

test_deploy_vm_l2network
Error
2.28
test_network.py

test_l2network_restart
Error
2.38
test_network.py

test_l2network_restart
Error
2.38
test_network.py

ContextSuite context=TestL2Networks>:teardown
Error
3.48
test_network.py

test_02_verifyRouterIpAfterNetworkRestart
Failure
1.07
test_network.py

ContextSuite context=TestDeployVM>:setup
Error
0.00
test_vm_life_cycle.py

test_01_secure_vm_migration
Error
73.50
test_vm_life_cycle.py

test_02_unsecure_vm_migration
Error
216.81
test_vm_life_cycle.py

test_03_secured_to_nonsecured_vm_migration
Error
143.98
test_vm_life_cycle.py

test_04_nonsecured_to_secured_vm_migration
Error
144.14
test_vm_life_cycle.py

ContextSuite context=TestVMLifeCycle>:setup
Error
1.74
test_vm_life_cycle.py

test_network_acl
Error
5.28
test_network_acl.py

test_01_nic
Error
49.49
test_nic.py

ContextSuite context=TestCpuCapServiceOfferings>:setup
Error
0.00
test_service_offerings.py

ContextSuite context=TestServiceOfferings>:setup
Error
1.76
test_service_offerings.py

ContextSuite context=TestSnapshotRootDisk>:setup
Error
0.00
test_snapshots.py

test_02_routervm_iptables_policies
Error
1.21
test_routers_iptables_default_policy.py

test_01_single_VPC_iptables_policies
Error
5.29
test_routers_iptables_default_policy.py

test_01_VPC_nics_after_destroy
Error
4.67
test_vpc_router_nics.py

test_02_VPC_default_routes
Error
5.75
test_vpc_router_nics.py

test_02_cancel_host_maintenace_with_migration_jobs
Error
1.41
test_host_maintenance.py

test_03_cancel_host_maintenace_with_migration_jobs_failure
Error
1.48
test_host_maintenance.py

test_01_cancel_host_maintenance_ssh_enabled_agent_connected
Failure
15.44
test_host_maintenance.py

test_03_cancel_host_maintenance_ssh_disabled_agent_connected
Failure
18.47
test_host_maintenance.py

test_04_cancel_host_maintenance_ssh_disabled_agent_disconnected
Failure
29.53
test_host_maintenance.py

ContextSuite context=TestHostMaintenanceAgents>:teardown
Error
30.64
test_host_maintenance.py

@blueorangutan test keepEnv

@sureshanaparti a Trillian-Jenkins test job (centos7 mgmt + kvm-centos7) has been kicked to run smoke tests

Trillian test result (tid-3091)
Environment: kvm-centos7 (x2), Advanced Networking with Mgmt server 7
Total time taken: 34721 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr5857-t3091-kvm-centos7.zip
Smoke tests completed. 71 look OK, 21 have errors
Only failed tests results shown below:

Test
Result
Time (s)
Test File

test_02_deploy_vm_from_direct_download_template
Error
1.19
test_templates.py

ContextSuite context=TestTemplates>:setup
Error
17.80
test_templates.py

ContextSuite context=TestRemoteDiagnostics>:setup
Error
0.00
test_diagnostics.py

test_01_deploy_vm_from_direct_download_template_nfs_storage
Error
1.20
test_direct_download.py

ContextSuite context=TestDirectDownloadTemplates>:teardown
Error
1.08
test_direct_download.py

test_01_add_primary_storage_disabled_host
Error
0.57
test_primary_storage.py

test_01_primary_storage_nfs
Error
0.10
test_primary_storage.py

ContextSuite context=TestStorageTags>:setup
Error
0.19
test_primary_storage.py

test_01_vpc_privategw_acl
Failure
5.69
test_privategw_acl.py

test_02_vpc_privategw_static_routes
Failure
6.66
test_privategw_acl.py

test_03_vpc_privategw_restart_vpc_cleanup
Failure
5.63
test_privategw_acl.py

test_04_rvpc_privategw_static_routes
Failure
7.70
test_privategw_acl.py

ContextSuite context=TestLBRuleUsage>:setup
Error
3.79
test_usage.py

ContextSuite context=TestNatRuleUsage>:setup
Error
5.42
test_usage.py

ContextSuite context=TestPublicIPUsage>:setup
Error
7.05
test_usage.py

ContextSuite context=TestResetVmOnReboot>:setup
Error
0.00
test_reset_vm_on_reboot.py

test_01_so_removal_resource_update
Error
1.31
test_resource_accounting.py

test_01_create_delete_portforwarding_fornonvpc
Error
1.79
test_portforwardingrules.py

test_03_deploy_vm_domain_service_offering
Error
8.16
test_domain_service_offerings.py

test_03_create_vpc_domain_vpc_offering
Error
6.04
test_domain_vpc_offerings.py

test_01_invalid_upgrade_kubernetes_cluster
Failure
3606.10
test_kubernetes_clusters.py

test_02_upgrade_kubernetes_cluster
Failure
71.58
test_kubernetes_clusters.py

test_03_deploy_and_scale_kubernetes_cluster
Failure
44.03
test_kubernetes_clusters.py

test_04_autoscale_kubernetes_cluster
Failure
4.24
test_kubernetes_clusters.py

test_05_basic_lifecycle_kubernetes_cluster
Failure
4.21
test_kubernetes_clusters.py

test_06_delete_kubernetes_cluster
Failure
4.21
test_kubernetes_clusters.py

test_07_deploy_kubernetes_ha_cluster
Failure
3.20
test_kubernetes_clusters.py

test_08_upgrade_kubernetes_ha_cluster
Failure
4.24
test_kubernetes_clusters.py

test_09_delete_kubernetes_ha_cluster
Failure
4.20
test_kubernetes_clusters.py

ContextSuite context=TestKubernetesCluster>:teardown
Error
101.63
test_kubernetes_clusters.py

ContextSuite context=TestDeployVM>:setup
Error
0.00
test_vm_life_cycle.py

ContextSuite context=TestVMLifeCycle>:setup
Error
1.68
test_vm_life_cycle.py

test_network_acl
Error
5.26
test_network_acl.py

test_01_nic
Error
49.36
test_nic.py

ContextSuite context=TestCpuCapServiceOfferings>:setup
Error
0.00
test_service_offerings.py

ContextSuite context=TestServiceOfferings>:setup
Error
1.82
test_service_offerings.py

ContextSuite context=TestSnapshotRootDisk>:setup
Error
0.00
test_snapshots.py

test_02_routervm_iptables_policies
Error
1.21
test_routers_iptables_default_policy.py

test_01_single_VPC_iptables_policies
Error
6.34
test_routers_iptables_default_policy.py

test_01_VPC_nics_after_destroy
Error
5.65
test_vpc_router_nics.py

test_02_VPC_default_routes
Error
6.68
test_vpc_router_nics.py

test_01_cancel_host_maintenace_with_no_migration_jobs
Error
0.04
test_host_maintenance.py

test_02_cancel_host_maintenace_with_migration_jobs
Error
0.04
test_host_maintenance.py

test_03_cancel_host_maintenace_with_migration_jobs_failure
Error
0.04
test_host_maintenance.py

test_01_cancel_host_maintenance_ssh_enabled_agent_connected
Error
0.01
test_host_maintenance.py

test_03_cancel_host_maintenance_ssh_disabled_agent_connected
Error
0.01
test_host_maintenance.py

test_04_cancel_host_maintenance_ssh_disabled_agent_disconnected
Error
0.01
test_host_maintenance.py

test_hostha_enable_ha_when_host_in_maintenance
Error
303.73
test_hostha_kvm.py

@blueorangutan test keepEnv

@sureshanaparti a Trillian-Jenkins test job (centos7 mgmt + kvm-centos7) has been kicked to run smoke tests

Trillian test result (tid-3121)
Environment: kvm-centos7 (x2), Advanced Networking with Mgmt server 7
Total time taken: 45706 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr5857-t3121-kvm-centos7.zip
Smoke tests completed. 91 look OK, 1 have errors
Only failed tests results shown below:

Test
Result
Time (s)
Test File

test_01_invalid_upgrade_kubernetes_cluster
Failure
3609.28
test_kubernetes_clusters.py

test_02_upgrade_kubernetes_cluster
Failure
3610.33
test_kubernetes_clusters.py

test_03_deploy_and_scale_kubernetes_cluster
Failure
0.07
test_kubernetes_clusters.py

test_04_autoscale_kubernetes_cluster
Failure
0.04
test_kubernetes_clusters.py

test_05_basic_lifecycle_kubernetes_cluster
Failure
0.04
test_kubernetes_clusters.py

test_06_delete_kubernetes_cluster
Failure
0.03
test_kubernetes_clusters.py

test_07_deploy_kubernetes_ha_cluster
Failure
0.03
test_kubernetes_clusters.py

test_08_upgrade_kubernetes_ha_cluster
Failure
0.04
test_kubernetes_clusters.py

test_09_delete_kubernetes_ha_cluster
Failure
0.03
test_kubernetes_clusters.py

ContextSuite context=TestKubernetesCluster>:teardown
Error
89.01
test_kubernetes_clusters.py

@blueorangutan package

@sureshanaparti a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

Packaging result: :heavy_check_mark: el7 :heavy_check_mark: el8 :heavy_check_mark: debian :heavy_check_mark: suse15. SL-JID 2442

@shwstppr Set config "storage.max.volume.size" to 10, and performed the following tests. Check tests not working as expected (marked in bold).

Deployed VM with 8 GB disk [Passed, Works as expected]
Deployed VM with 11 GB ROOT disk override [Failed, Works as expected]

- Deployed VM with 9 GB ROOT disk and 3 GB Data Disk [Failed, Not working as expected, Cumulative size of ROOT and DATA disk are considered for validation, in this case it is comparing against 11 GB size]

Deployed VM with ISO, having 5 GB fixed disk offering [Passed, Works as expected]

- Deployed VM with ISO, having 11 GB custom disk offering [Failed, Works as expected, but size in the error message is incorrect (Requested volume size is 14.99 GB, but the maximum size allowed is 10 GB)]
- Deployed VM with ISO, having 20 GB fixed disk offering [Failed, Works as expected, but size in the error message is incorrect (Requested volume size is 23.99 GB, but the maximum size allowed is 10 GB)]
- Deployed VM with ISO, having 9 GB custom disk offering [Failed, Not working as expected, Cumulative size of ISO - 3.99 GB and DATA disk are considered for validation, in this case it is comparing against 12.99 GB size (Requested volume size is 12.99 GB, but the maximum size allowed is 10 GB)]

Created Disk Offering with disk size 11 GB [Failed, Works as expected]

- Created Compute Offering with ROOT disk size 11 GB [Passed, Not working as expected, Shouldn't allow]
- Deployed VM with Compute Offering having ROOT disk size 11 GB disk [Passed, Not working as expected, Shouldn't allow]

Create DATA volume with 20 GB fixed disk offering [Failed, Works as expected]

Create DATA volume with 1 GB custom disk offering [Passed, Works as expected]

Resize DATA volume of a running VM, from 9 GB to 20 GB fixed disk offering [Failed, Works as expected]

Resize ROOT volume of a running VM, from 8 GB to 11 GB [Failed, Works as expected]

Resize ROOT volume of a running VM, from 8 GB to 10 GB [Passed, Works as expected]

Resize DATA volume of a running VM, from 1 GB to 5 GB fixed disk offering [Passed, Works as expected]

Resize DATA volume of a running VM, from 5 GB to 9 GB custom disk offering [Passed, Works as expected]

Resize DATA volume of a running VM, from 9 GB to 20 GB fixed disk offering [Failed, Works as expected]

Resize DATA volume of a running VM, from 9 GB to 11 GB custom disk offering [Failed, Works as expected]

Resize ROOT volume of a stopped VM, from 8 GB to 11 GB [Failed, Works as expected]

Resize ROOT volume of a stopped VM, from 8 GB to 9 GB [Passed, Works as expected]

Resize DATA volume of a stopped VM, 9 GB to 20 GB fixed disk offering [Failed, Works as expected]

Resize DATA volume of a stopped VM, 9 GB to 10 GB custom disk offering [Passed, Works as expected]

Resize detached DATA volume, from 5 GB to 20 GB fixed disk offering [Failed, Works as expected]

Resize detached DATA volume, from 5 GB to 7 GB custom disk offering [Passed, Works as expected]

@sureshanaparti I don't think the config applies to cumulative VM volume size. In my understanding it is for individual volumes.
I'll check and update for offering's root disk size and size mismatch in error message

@shwstppr a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

Packaging result: :heavy_multiplication_x: el7 :heavy_multiplication_x: el8 :heavy_multiplication_x: debian :heavy_multiplication_x: suse15. SL-JID 2446

@blueorangutan package

@shwstppr a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

Packaging result: :heavy_check_mark: el7 :heavy_check_mark: el8 :heavy_check_mark: debian :heavy_check_mark: suse15. SL-JID 2447

@blueorangutan test

@sureshanaparti a Trillian-Jenkins test job (centos7 mgmt + kvm-centos7) has been kicked to run smoke tests

@sureshanaparti I don't think the config applies to cumulative VM volume size. In my understanding it is for individual volumes.
I'll check and update for offering's root disk size and size mismatch in error message

@shwstppr Verified the cases not working as expected, with the latest changes. Invalid error message in one case, check below.

Deployed VM with 9 GB ROOT disk and 3 GB Data Disk [Passd, Working as expected]
Deployed VM with ISO, having 11 GB custom disk offering [Failed, Works as expected]
Deployed VM with ISO, having 20 GB fixed disk offering [Failed, Works as expected]
Deployed VM with ISO, having 9 GB custom disk offering [Passed, Working as expected]
Created Compute Offering with ROOT disk size 11 GB [Failed, Working as expected]
- Deployed VM with Compute Offering having ROOT disk size 11 GB disk [Failed, Working as expected, But wrong error message - Please specify a size of at least 1 GB.]

@blueorangutan package

@shwstppr a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

Packaging result: :heavy_check_mark: el7 :heavy_check_mark: el8 :heavy_check_mark: debian :heavy_check_mark: suse15. SL-JID 2454

@blueorangutan test

@sureshanaparti a Trillian-Jenkins test job (centos7 mgmt + kvm-centos7) has been kicked to run smoke tests

Trillian test result (tid-3158)
Environment: kvm-centos7 (x2), Advanced Networking with Mgmt server 7
Total time taken: 32479 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr5857-t3158-kvm-centos7.zip
Smoke tests completed. 92 look OK, 0 have errors
Only failed tests results shown below:

Test
Result
Time (s)
Test File

@blueorangutan package

@sureshanaparti a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

Packaging result: :heavy_check_mark: el7 :heavy_check_mark: el8 :heavy_check_mark: debian :heavy_check_mark: suse15. SL-JID 2486

@sureshanaparti I don't think the config applies to cumulative VM volume size. In my understanding it is for individual volumes.
I'll check and update for offering's root disk size and size mismatch in error message

@shwstppr Verified the cases not working as expected, with the latest changes. Invalid error message in one case, check below.

Deployed VM with 9 GB ROOT disk and 3 GB Data Disk [Passd, Working as expected]
Deployed VM with ISO, having 11 GB custom disk offering [Failed, Works as expected]
Deployed VM with ISO, having 20 GB fixed disk offering [Failed, Works as expected]
Deployed VM with ISO, having 9 GB custom disk offering [Passed, Working as expected]
Created Compute Offering with ROOT disk size 11 GB [Failed, Working as expected]
Deployed VM with Compute Offering having ROOT disk size 11 GB disk [Failed, Working as expected, But wrong error message - Please specify a size of at least 1 GB.]

Verified the error message with the latest changes. LGTM.

@blueorangutan package

@sureshanaparti a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

Packaging result: :heavy_check_mark: el7 :heavy_check_mark: el8 :heavy_check_mark: debian :heavy_check_mark: suse15. SL-JID 2492


Change alert type in AKS workbook

Fixes #
Change the alert type prefix for Kubernetes alerts from "AKS_" to the new prefix "K8S_"
Proposed Changes

@yoweiz : Validation is failing because there is a documentation link @ line no 1230 which have locale (en-US) in it.  Can you please update the link,
From : https://docs.microsoft.com/en-us/azure/aks/view-master-logs
To : https://docs.microsoft.com/azure/aks/view-master-logs
Thanks
Ruchita