How to Invoke a function which is on an another application?

In spin, how can I invoke a function of another application? Is it necessary to do it through the network? Or can't?
If it is possible, it's awsome.

Currently, you have to go through the trigger — if it's an HTTP component, you can make an outbound HTTP call to the endpoint for that function (and if it's another trigger, generate an event that would trigger that function).
For example, if you have a front-end and a back-end, you could make calls from the front-end to the back-end:
https://github.com/radu-matei/spin-react-fullstack/blob/0252f6eb64be0276b9f2de30193ab89b4807ed09/frontend/src/App.js#L8-L16
(notice how the back-end is on the /api/... route: https://github.com/radu-matei/spin-react-fullstack/blob/0252f6eb64be0276b9f2de30193ab89b4807ed09/spin.toml#L22-L23)
This is a Rust example that makes a call to another component of the same application (or to another application, depending on where the URL points): https://github.com/fermyon/spin-kitchensink/blob/c0d0f2b0487df0cb9f151b7dd8f7cd13f9ab1087/rust-outbound-http/src/lib.rs#L19-L24
We are trying to simplify the scenario where two components of the same application are trying to make calls to each other — see #957.
In the future, we want to enable invoking other components based on the component model — but that is not yet possible.
Let me know if this answers your question.

@radu-matei Yeah, Thanks for your reply.

In the future, we want to enable invoking other components based on the component model — but that is not yet possible.

Looking forward to this feature. It's seems that better than traditional microservice rpc.

In the future, we want to enable invoking other components based on the component model — but that is not yet possible.

@radu-matei Are there any plans for this amazing feature?

@radu-matei I'm so interest in invoking other components feature. May be we can split it into multi small tasks?  Can assign some task to me?

What?
Nice to see that we now have the convinces for HTTP communication between components here: https://github.com/fermyon/spin/issues/957.
I would love to see some means of more direct component to component interaction on the basis of direct function calls. For example we have could a spring component written in Rust that would expose a function for another component written in JavaScript to call. My grasp of WASM is tenuous at best but it appears that at least when running in a browser context a WASM module can declare exports accessible via javascript c.f.  https://developer.mozilla.org/en-US/docs/WebAssembly/Exported_functions. I am imaging that spin.toml would declare an import (perhaps reiterating an export as well) and that those are then available for a call.
Why?
As new Spin SDKs come online would allow earlier use from other language environments. For example today we have the ability to connected to external DBs from Rust but not JavaScript. With this in place, a Rust component could provide access to external DBs by virtue of function call rather than having to make it available to a JavaScript component with  another network call. There may be faster better solutions to this particular problem but we could imagine others like it. One of the beauties of a component / plugin model is that the spin ecosystem can grow via contributions from users of many different language / library ecosystems.
How?
What pieces are needed for something like this to work?
Javy from which spin-js-sdk borrows, does have support for exporting functions with a wit file that can be executed via wasmtime run --invoke. Javy also provides support for dynamically linked modules which are accessible to the main wasm/wasi app via wasmtime run --preload. I have not read the spin code yet to understand what runtime it uses--is it wasmtime or something else?--or how it is invoked. I'll add any further learnings in a follow-up comment. Pointers from the core team appreciated if they read this before I get further.

Now reading https://github.com/fermyon/spin/blob/main/crates/core/src/lib.rs ... : )

See also https://github.com/fermyon/spin/discussions/1686#discussioncomment-6732756 and https://www.fermyon.com/blog/composing-components-with-spin-2
I am also trying to wrap my head around what is happening in trigger-http With wasm-tools compose two components are statically linked and combined into a new binary but this appears to load and invoke another component dynamically -- is that right?  Or is this Rust feature not really a wasm feature?
        let (instance, mut store) = engine.prepare_instance(component_id).await?;
        let EitherInstance::Component(instance) = instance else {
            unreachable!()
        };

        set_http_origin_from_request(&mut store, engine, &req);

        let resp = match HandlerType::from_exports(instance.exports(&mut store)) {
            Some(HandlerType::Wasi) => Self::execute_wasi(store, instance, base, raw_route, req, client_addr).await?,
            Some(HandlerType::Spin) => {
                Self::execute_spin(store, instance, base, raw_route, req, client_addr)
                    .await
                    .map_err(contextualise_err)?
            }
            None => bail!("Expected component to either export `{}` or `fermyon:spin/inbound-http` but it exported neither", WASI_HTTP_EXPORT)

@jpshackelford What you are seeing there is some host magic to adapt core modules so that Spin can treat everything, classic core module or new-fangled component, as a component model component.
For composing CM components, my colleague @kate-goldenring has just published a blog https://www.fermyon.com/blog/composing-components-with-spin-2 which addresses how to do this with actual Wasm components - that might be more relevant to what you're asking about I think?  It's not directly what you're asking about here but possibly in the right direction?

@jpshackelford wow... I am a complete muppet. You mentioned Kate's blog in the first line of your comment.  Sorry for missing it and apologies for my redundant comment!

@itowlson Thanks very much for the quick reply. I am asking some very newb questions here so I appreciate the patience of you and others. I had the pleasure of being in the room where @kate-goldenring presented this morning and enjoyed her talk.
I think I am attracted to this host magic approach because it is very simple and dynamic whereas creating components has the overhead building the wit files and running wasm-tools compose so the end-user loses some of the feel of staying in their own language ecosystem and "borrowing" pre-built functions from another ecosystem.
I am still learning about wit-bindgen and witgen. Perhaps finding ways to have spin do more work with these and wasm-tools compose  behind the scenes would hep but I have more learning to do.  I'll keep posting questions learnings on this issue as trail for others with similar interests but also happy to move to posts in Discord or https://github.com/fermyon/spin/discussions if that is better.

Host magic is very much where we want to get to.  @fibonacci1729 has a SIP in progress, https://github.com/fermyon/spin/pull/1804, which we were hoping to get done for Spin 2.0 but ran out of time: this proposes a way for users to say, in the spin.toml file, "hey Spin, compose my handler with this auth component (or that credit card processing component, or...) and run that composed component."
But yes, for now, manual composition using wasm-tools is very much where it's at.  And even Brian's proposal doesn't solve the problem of "huh, I need to run a special cargo component build command... and copy all these WITs... and..."  Adoption for that stuff into core toolchains will take a lot of time.

@jpshackelford this is helpful to hear where the journey of using components is becoming convoluted. As @itowlson mentions, SIP https://github.com/fermyon/spin/pull/1804 will help remove the wasm-tools compose but it does not remove the need for someone to use their language's component tooling to generate bindings and use them within their component, which does require an understanding of WIT. There have been discussions within the Bytecode Alliance about creating a tool that can generate docs for generated bindings to make it easier to understand how to use them.
I could also see us get to a future where ubiquitous components or libraries become well known enough again that they each have their own upstream SDKs for using them. You could imagine auth_middlewear::authenticate() being the call instead of crate::wasi::http::incoming_handler::handle(request, output.into_inner());


08/01/2018 06:02 : Create Pull Request for branch master -> prTesting1_2018080105

:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

split/updateTestCon1.md
:white_check_mark:Succeeded

For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.


create-dist.py with rebranded electron

Having an issue building a rebranded version of electron using the create-dist.py script.
There's no mention of using create-dist.py in the rebranding tutorial so this may be a new feature request for the script.
https://github.com/atom/electron/blob/master/docs/tutorial/application-distribution.md#rebranding-by-rebuilding-electron-from-source
Ideally we could use the create-dist.py --target myapp flag to use our custom branding.
GYP_DEFINES="project_name=myapp product_name=myApp"
$ ./script/build.py -t myapp
...
$ ./script/create-dist.py
...
ninja: Entering directory out/R
ninja: error: unknown target 'electron'

Now for rebanding you can just edit the atom.gyp, I'll update the documents.


[Question] Isn't the AuthConsumer redundant?

This is a nice library and a very good example on using React v16 Context API.
Thank you for creating it.
The technique used in AuthProvider.js is very interesting. I hope to use it in my project.
It seemed to me AuthConsumer.js could be simplified to just two lines as below.
Would that be correct?
import { Consumer } from '../context';
export default Consumer;

Yes you are right. Thank you so much for pointing it out :)


Further API streamlining for v2

The development work for v2 has made streamlining the package's API a point of emphasis (see #1106). I propose a couple more streamlining changes to take effect in v2 but have FutureWarnings in v1. The short story is we should deprecate then remove the speed and utils_graph modules by moving their functionality into more sensible modules.
v1.7.0 recent introduced a new routing module to move shortest path solving out of the distance module. Routing functionality has been historically distributed across the distance, speed, and utils_graph modules. We should move it all into the routing module. The former distance.shortest_path and distance.k_shortest_paths functions were already moved accordingly in v1.7.0, with a FutureWarning. The speed module's functions should do the same, as should utils_graph.route_to_gdf.
The utils_graph.remove_isolated_nodes and utils_graph.get_largest_component functions should move to the truncate module, which is their most natural home.
Finally, we should move the utils_graph module's get_digraph, get_undirected, graph_to_gdfs, and graph_from_gdfs functions to a new convert module that houses data type converters.

Streamlining work in #1148. Deprecation work in #1146.


Update 2023-08-15-OLS-joining-forces-with-communities-to-broaden-part…

…icipation-in-open-science.md
Adding MetaDocencia's funding sources at the end.

The change looks good. Thanks


Unable to authenticate with hotspot

I have been unable to join a hotspotd network from 3 android devices.  The hotspots are visible, but android fails to connect in the WPA authentication stage.

Did you check your firewall settings?

@mhess-connectify I'm closing this. Let me know if you face any other issue.


View and edit embedded graphs

necessary for using map, reduce, Repeater, etc. with Visual Editor

Declaring victory kudos to @paullewis  🚢


Multiple usage of component

Thank you for creating this component!
We are using this component multiple times (like many many times) on the same page. Sadly it loads the editor assets again with every component which slows initial page load down quite a bit:

Is there a way to avoid this?

Hi @dermansi
Every time using CKEditor, each editor will load each specifies asset (such as the CSS file) for each editor. I see the same your issues on https://ckeditor.com/docs/ckeditor4/latest/examples/classic.html#editor1
But I will investigate for load 1 assets for multiple editors.
Thank you for contributing the issue for this component.

Hi @dermansi
Every time using CKEditor, each editor will load each specifies asset (such as the CSS file) for each editor. I see the same your issues on https://ckeditor.com/docs/ckeditor4/latest/examples/classic.html#editor1
But I will investigate for load 1 assets for multiple editors.
Thank you for contributing the issue for this component.


Account.key path is not created when using acme reg -gen

When using the command:
c:\Acme> acme reg -gen<EMAIL_ADDRESS>it throws an error
account key: open C:\Users\myusername\.config\acme\account.key: The system cannot find the path specified.
when the .config directory does not exist.
This is on Windows 10, with the 1.1.1 binary.
Workaround: create directories manually.
Fix: automatically create directories .config and .config/acme if they dont' exist.

The (open) pull request #56 might fix that (change to first file there, the other is a nicer error message for a different case).
Not tested on windows, though, but it sounds like the same issue.


No Listbox widget

There is no support for a listbox currently, is there any plans to get one implemented?
Here is an example of a listbox

This is a pretty important GUI element to have available

On a side note I would be willing to try to implement some of these widgets if you had some basic documentation on how to add new widgets to LUI

Right now there are only select boxes. Listboxes seem useful, although I don't know when I'd find some time to implement them.
Unfortunately there is not much documentation about adding new widgets, however it's not that complicated.
You can just create your own widget class in Builtin/ (for example, see https://github.com/tobspr/LUI/blob/master/Builtin/LUIButton.py), and implement the gui control there.
There are also people who already contributed something, you might be able to meet them in the panda3d irc, they probably can help you with that, too.
If you have any further/specific questions, don't hesitate to ask :)

So I spent most of my night getting the ground work laid for a functional listbox widget. Functionally I actually got one working, as I mostly reused the code from the Radio and RadioGroup.
bad listbox
The last major step I need to make is removing the O from the left of the bullet. But when I comment out the line
self._sprite
in class LUIListBoxOption the vertical alignment of it all blows up and looks like this
ugly listbox
Here is the source code of what I got so far. Do you have any clue what is causing the bad vertical alignment?

from LUIObject import LUIObject
from LUISprite import LUISprite
from LUILabel import LUILabel
from LUILayouts import LUICornerLayout, LUIHorizontalStretchedLayout
from LUIInitialState import LUIInitialState
from LUIScrollableRegion import LUIScrollableRegion
from LUIVerticalLayout import LUIVerticalLayout

from functools import partial

__all__ = ["LUIListbox"]

class LUIListbox(LUIObject):

    """ Selectbox widget, showing several options whereas the user can select
    only one. """

    def __init__(self, width=200, height=200, options=None, selected_option=None, **kwargs):
        """ Constructs a new selectbox with a given width """
        LUIObject.__init__(self, x=0, y=0, w=width + 4, h=height + 4, solid=True)
        LUIInitialState.init(self, kwargs)
        # The selectbox has a small border, to correct this we move it
        self.margin.left = -2

        self._bg_layout = LUIScrollableRegion(parent=self, width="100%")
        self._v_layout = LUIVerticalLayout(parent=self._bg_layout)
        self._option_group = LUIListboxOptionGroup()
        for i in range(1, 40):
            LUIListboxOption(parent=self._v_layout.cell(), label=str(i), group=self._option_group)

class LUIListboxOptionGroup(LUIObject):

    """ Simple helper to group a bunch of LUIListOption and ensure only one is
    checked at one timem """

    def __init__(self):
        """ Constructs a new group without any ListOptiones inside """
        self._boxes = []
        self._selected_box = None

    def register_box(self, box):
        """ Registers a box to the collection """
        if box not in self._boxes:
            self._boxes.append(box)

    def set_active_box(self, active_box):
        """ Internal function to set the active box """
        for box in self._boxes:
            if box is not active_box:
                box._update_state(False)
                box._label.alpha = 1.0
            else:
                box._label.alpha = 0.3
                box._update_state(True)
        self._selected_box = active_box

    def get_active_box(self):
        """ Returns the current selected box """
        return self._selected_box

    active_box = property(get_active_box, set_active_box)

    def get_active_value(self):
        """ Returns the value of the current selected box (or None if none is
        selected) """
        if self._selected_box is None:
            return None
        return self._selected_box.get_value()

    active_value = property(get_active_value)

class LUIListboxOption(LUIObject):

    """ A radiobox which can be used in combination with a LUIListboxOptionGroup """

    def __init__(self, parent=None, group=None, value=None, active=False, label=u"Option", **kwargs):
        """ Constructs a new radiobox. group should be a handle to a LUIListboxOptionGroup.
        value will be the value returned by group.value, in case the box was
        selected. By default, the radiobox is not active. """
        assert group is not None, "LUIListboxOption needs a LUIListboxOptionGroup!"
        LUIObject.__init__(self, x=0, y=0, solid=True)
        self._sprite = LUISprite(self, "Radiobox_Default", "skin") # Removing me causes the vertical problem
        self._label = LUILabel(parent=self, text=label, margin=(0, 0, 0, 23),
                               center_vertical=True)
        self._value = value
        self._active = False
        self._hovered = False
        self._group = group
        self._group.register_box(self)
        if active:
            self.set_active()
        if parent:
            self.parent = parent
        LUIInitialState.init(self, kwargs)

    def on_click(self, event):
        """ Internal onclick handler. Do not override. """
        self.set_active()

    def on_mouseover(self, event):
        """ Internal mouseover handler """
        self._hovered = True
        self._update_sprite()

    def on_mouseout(self, event):
        """ Internal mouseout handler """
        self._hovered = False
        self._update_sprite()

    def set_active(self):
        """ Internal function to set the radiobox active """
        if self._group is not None:
            self._group.set_active_box(self)
        else:
            self._update_state(True)
        """ Internal method to select an option """

    def get_value(self):
        """ Returns the value of the radiobox """
        return self._value

    def set_value(self, value):
        """ Sets the value of the radiobox """
        self._value = value

    value = property(get_value, set_value)

    def get_label(self):
        """ Returns a handle to the label, so it can be modified (e.g. change
            its text) """
        return self._label

    label = property(get_label)

    def _update_state(self, active):
        """ Internal method to update the state of the radiobox. Called by the
        LUIListboxOptionGroup """
        self._active = active
        self.trigger_event("changed")
        self._update_sprite()

    def on_mousedown(self, event):
        """ Internal onmousedown handler. Do not override. """
        self._sprite.color = (0.86, 0.86, 0.86, 1.0)

    def on_mouseup(self, event):
        """ Internal onmouseup handler. Do not override. """
        self._sprite.color = (1, 1, 1, 1)

    def _update_sprite(self):
        """ Internal function to update the sprite of the radiobox """
        img = "Radiobox_Active" if self._active else "Radiobox_Default"
        if self._hovered:
            img += "Hover"
        self._sprite.set_texture(img, "skin")

First of all, thanks for your effort!
Do you see any error messages on the console? Make sure you also comment the usage of self._sprite in the member methods (on_mousedown, on_mouseup, etc..).
Also, try removing the center_vertical option from the Label (self._label). It's a while since I programmed it, but I believe it might cause issues since then the label will have no height then.
Best regards,
Tobias

Okay that worked well. But how would you suggest changing the background color of the label and having it expand to the entire region? I need to do this for visuals and so that the user does not have to click on the text directly to activate the option.
Here is what it looks like currently

It also appears like it is a bit offset to the right still; I am not sure what is causing that.

The offset to the right is because the label has some margin. If you remove the margin=(0, 0, 0, 23) on the label, it will stick to the left.
If you set the width of the label to "100%", it should fill the whole container, and thus recieve all click events.
However, I believe there is no easy way to set the background color of the label. You would have to make an empty sprite behind the label (Use a LUISprite with the "blank" texture), and set its color to the desired background color. You can set the width and height of the background sprite to "100%" to make sure it fills the whole cell.

I can set either the LUIListboxOption or the LUILabel inside of it to "100%" and it will not do the expected behavior. Perhaps this serves as the example you were talking about in this issue

You will have to set the width of both the LUIListboxOption and the LUILabel to 100%. Does it work then?

Same behavior if I specify it twice.

Hm, I will have a look then. Could you tell me what region.root.ls() prints? (Region is your LUIRegion)

[LUIBaseElement] pos = 0, 0; size = 800 x 600; z = 0
 [LUIFrame] pos = 0, 0; size = 200 x 0; z = 0
  [LUICornerLayout] pos = 0, 0; size = 0 x 0; z = 0
   [LUISprite] pos = 0, 0; size = 5 x 5; tex = SunkenFrame_TR:skin; z = 0
   [LUISprite] pos = 0, 0; size = 0 x 5; tex = SunkenFrame_Top:skin; z = 0
   [LUISprite] pos = 0, 0; size = 5 x 5; tex = SunkenFrame_TL:skin; z = 0
   [LUISprite] pos = 0, 0; size = 5 x 0; tex = SunkenFrame_Right:skin; z = 0
   [LUISprite] pos = 0, 0; size = 0 x 0; tex = SunkenFrame_Mid:skin; z = 0
   [LUISprite] pos = 0, 0; size = 5 x 0; tex = SunkenFrame_Left:skin; z = 0
   [LUISprite] pos = 0, 0; size = 5 x 5; tex = SunkenFrame_BR:skin; z = 0
   [LUISprite] pos = 0, 0; size = 0 x 5; tex = SunkenFrame_Bottom:skin; z = 0
   [LUISprite] pos = 0, 0; size = 5 x 5; tex = SunkenFrame_BL:skin; z = 0

This seems somewhat incomplete, can you try calling it after a second or so, e.g. using taskMgr.doMethodLater ?

      [LUISlider] pos = 0, 0; size = 250 x 0; z = 0
       [LUIHorizontalStretchedLayout] pos = 0, 0; size = 0 x 0; z = 0
        [LUIHorizontalLayout] pos = 0, 0; size = 0 x 0; z = 0
         [LUILayoutCell] pos = 0, 0; size = 0 x 0; z = 0
          [LUISprite] pos = 0, 0; size = 3 x 7; tex = SliderBg_Left:skin; z = 0
         [LUILayoutCell] pos = 0, 0; size = 0 x 0; z = 0
          [LUISprite] pos = 0, 0; size = 0 x 7; tex = SliderBg:skin; z = 0
         [LUILayoutCell] pos = 0, 0; size = 0 x 0; z = 0
          [LUISprite] pos = 0, 0; size = 3 x 7; tex = SliderBg_Right:skin; z = 0
       [LUIObject] pos = 0, 0; size = 0 x 0; z = 1
        [LUISprite] pos = 0, 0; size = 4 x 8; tex = NULL; z = 0
        [LUISprite] pos = 0, 0; size = 121 x 8; tex = NULL; z = 0
       [LUISprite] pos = 0, 0; size = 18 x 18; tex = NULL; z = 2
   [LUILayoutCell] pos = 0, 0; size = 0 x 0; z = 0
    [LUIHorizontalLayout] pos = 0, 0; size = 0 x 0; z = 0
     [LUILayoutCell] pos = 0, 0; size = 0 x 0; z = 0
      [LUILabel] pos = 0, 0; size = 0 x 0; z = 0
       [LUIText] pos = 0, 0; size = 76 x 17; text = u'Sound Effect'; color = 0 0 0 0.6 / 1 1 1 1; z = 0
       [LUIText] pos = 0, 0; size = 76 x 17; text = u'Sound Effect'; color = 0.9 0.9 0.9 1 / 1 1 1 1; z = 1
     [LUILayoutCell] pos = 0, 0; size = 0 x 0; z = 0
      [LUISlider] pos = 0, 0; size = 250 x 0; z = 0
       [LUIHorizontalStretchedLayout] pos = 0, 0; size = 0 x 0; z = 0
        [LUIHorizontalLayout] pos = 0, 0; size = 0 x 0; z = 0
         [LUILayoutCell] pos = 0, 0; size = 0 x 0; z = 0
          [LUISprite] pos = 0, 0; size = 3 x 7; tex = SliderBg_Left:skin; z = 0
         [LUILayoutCell] pos = 0, 0; size = 0 x 0; z = 0
          [LUISprite] pos = 0, 0; size = 0 x 7; tex = SliderBg:skin; z = 0
         [LUILayoutCell] pos = 0, 0; size = 0 x 0; z = 0
          [LUISprite] pos = 0, 0; size = 3 x 7; tex = SliderBg_Right:skin; z = 0
       [LUIObject] pos = 0, 0; size = 0 x 0; z = 1
        [LUISprite] pos = 0, 0; size = 4 x 8; tex = NULL; z = 0
        [LUISprite] pos = 0, 0; size = 121 x 8; tex = NULL; z = 0
       [LUISprite] pos = 0, 0; size = 18 x 18; tex = NULL; z = 2

Can't see anything obvious, I will take a look when I find some time .. For the meantime you could try setting a hardcoded width, e.g. 200 or so

I finished my listbox with the only issue being it does not adjust to the theme color. Any clue how I can do that? After that I will email you the file so you can add it to the repo. PR seems overkill for this.

Could you tell me how to make it so that I can override the click, mouseup, mousedown, etc events so users can implement custom behaviors for their listboxes?

To make the listbox adjust to the theme color, you should probably make a sprite which is the background of your list items (Right now I suppose you use the "blank" sprite). Advantage of that is also that users might make their custom background image instead of a solid color (not sure if this would look any good though).
The list looks cool, although I would probably add some padding to the text (E.g. text.padding.left = 5 or so).
Not sure what you mean with overriding events. You can either add on_xxx methods to your class where xxx is the name of the event, or you use my_element.bind("something", my_handler)
Tbh, I would prefer a pull request when the listbox is done, since this is easier to merge, and also shows the correct git history then (In case somebody has questions about the code or so)


i18n integration

Describe the bug
The integration with i18n is not working as expected. When switching the locale as described by the nuxtjs/i18n documentation, the  Default Meta are not updated accordingly. The affected properties are: html lang="", og:locale, og:site_name, %siteName from the page title.
Those properties are updated only when a page refresh is manually triggered from the browser button.
Reproduction
https://github.com/zonistefano/nuxtseo
System / Nuxt Info
- Operating System: Linux
- Node Version:     v20.11.0
- Nuxt Version:     3.11.2
- CLI Version:      3.11.1
- Nitro Version:    2.9.6
- Package Manager<EMAIL_ADDRESS>- Builder:          -
- User Config:      devtools, site, modules, i18n
- Runtime Modules<EMAIL_ADDRESS><EMAIL_ADDRESS>- Build Modules:    -

Same issue for me (with no_prefix)

Hey, thanks for this issue and reproduction. This is slightly improved in RC 17 but we still don't have full reactivity.
I've created a new issue to track that here: https://github.com/harlan-zw/nuxt-seo/issues/283


[WFCORE-5889] Upgrade Apache johnzon to 1.2.17

Fixes https://issues.redhat.com/browse/WFCORE-5889

@ehsavoie Could you review and approve, please? All links are in the Jira.

Added hold label since @jamezp's intention is to remove Apache johnzon here: https://github.com/wildfly/wildfly-core/pull/5052

Added hold label since @jamezp's intention is to remove Apache johnzon here: https://github.com/wildfly/wildfly-core/pull/5052

I do think we should remove Johnzon. It looks like #5052 is passing now. It required changes that have been merged into full.

Sorry, I only scanned for component upgrade Jiras/PRs before providing this.

Thanks anyway @boris-unckel


Create typings plugin

https://github.com/typings/typings
if a project has a typings.json file, then the typings must be installed via typings install. There should be an action at the end of the scaffolding wizard that allows you to install the typings. Not sure if we should go all out on creating a GUI for the typings tool, because of this blog post

Not sure if we should go all out on creating a GUI for the typings tool, because of this blog post

I am strongly in favor of doing the maximum we can in this area - as having to deal with Monterey support in the area Monterey should shine (make complex installation tasks easy) is really stupid :smile:

Just to confirm we read the article the same, the typings tool will soon be unnecessary. Monterey should be able to install typings automatically (this is easy), but a complete typings management screen to add/remove typings is not worth our time since the typings tool may not be around that long

When you wrote Not sure if we should go all out on creating a GUI for the typings tool - I understood it as your intent to go all out - where your idea was not to go all out because of the pending automation.
My drift was meant to ensure that we do the best we can do now - as I was completely confused by not being able to build the Typescript app with Monterey and assumed immediately that others will be confused as well. I am still confused why is it that so deep in the Typescript "era" one has to do some "post-install" actions.

When you wrote Not sure if we should go all out on creating a GUI for the typings tool - I understood it as your intent to go all out - where your idea was not to go all out because of the pending automation.

Ah yes, darn words


Memoryleak in Pythonista 3 and 2.1

There seems to be some sort of memory leak in StaSh.
When entering a command or an empty line in the StaSh commandline, the amount of objects in gc.garbage increases (write gci status to the StaSh prompt to get the amount of garbage).
When setting the debuglevel of the garbagecollector to DEBUG_LEAK, it will print a huge list of uncollectable objects, most of them appear to be some UI-Buttons on objc-level (write gci debug 62 to the StaSh-prompt to set debug to DEBUG_LEAK).
I have tested this with Pythonista3 (2.7.5), Pythonista 2.1 and 2.
Pythonista 2.0 does not seem to have any issues.
Pythonista3 and Pythonista 2.1 have memoryleaks when running StaSh.
Running normal scripts outside StaSh does not result in any memoryleaks.
The size of the garbage exeeds 1MB pretty fast.
I have tested this with the ywangd/dev branch.

Thanks for the issue report. I'll look into it when I have more time. Unfortunately I am very occupied with other things. So this will take a while.

@ywangd are you working on a new release or something? You haven't made a commit in a while.

I am not working on new releases. Simply do not have any time for it at this stage ...

@bennr01 Is this behavior different from default Pythonista behavior?  Without running stash and just using the Pythonista console, I'm seeing a consistent growth of garbage objects that don't seem to be "collectable".  The following is console output from Pythonista 3.1 (301016), on iOS 11.2.1 (64-bit iPad6,3), with a fresh launch of Pythonista:
>>> import gc
>>> tracked = gc.get_objects()
>>> print len(tracked)
4248
>>> tracked = gc.get_objects()
>>> print len(tracked)
4253
>>> tracked = gc.get_objects()
>>> print len(tracked)
4258
>>> gc.collect()
0
>>> tracked = gc.get_objects()
>>> print len(tracked)
4264


Exception zcx_mdp_json_invalid occured, but JSON validators found input as valid

Hello Faith,
first of all thank you sharing this great tool. I run into trouble when parsing a JSON string in ABAP. I turned on the debug feature by the constant available in your class to find the place, before the exception occurs. I spent some time, but finally decided rather to hand over this investigation to the master, because I'm not yet so familiar with your tool in detail. It would be great, if you can check this issue. I've created a test report for you, to analyze it, where you can tick option Display Before Parsing to show a dialog with the formatted version of the JSON, before the deserialization is called.
json.txt
json_parser.txt
Thank you
Attila

Hello Atilla,
I just saw this issue. I will look at it ASAP.
Thank you for feedback!
Fatih

Hi Attila, I have examined your excellent bug report. It seems that I embarrassingly forgot true, false and null values in deserializer! There was support for these values in the node class, so you only need to update your deserializer class: "zcl_mdp_json_deserializer"
I have added a few lines to your code for usage example.
Example for getting value:
  DATA: has_deletions TYPE string.
  has_deletions = root_node->object_get_child_node( key = 'status'
    )->object_get_child_node( key = 'otifioridoc'
    )->object_get_child_node( key = 'index'
    )->object_get_child_node( key = 'hasDeletions')->value.

  WRITE: 'status->otifioridoc->index->hasDeletions : ' , has_deletions.

Example for comparing true/false with json_type as an alternative to string value comparison:
  DATA: current_node TYPE REF TO zcl_mdp_json_node.
  current_node = root_node->object_get_child_node( key = 'status'
      )->object_get_child_node( key = 'otifioridoc'
      )->object_get_child_node( key = 'index'
      )->object_get_child_node( key = 'current').
  IF current_node->json_type = zcl_mdp_json_node=>co_json_true.
    WRITE: / 'current value is true.'.
  ELSE.
    WRITE: / 'current value is false.'.
  ENDIF.

Here is the file:
[json_parser_with_examples.txt]
(https://github.com/fatihpense/zcl_mdp_json/files/372524/json_parser_with_examples.txt)
Thank you for your bug report and interest.
Best wishes,
Fatih.

Hi Faith,
Everything is fine now with your correction. Thank you very much for your help and support. This tool is really great and convenient to use.
(I've just come back from vacation sorry for my answer delay. )
Best regards
Attila


linked css vs css_file parameter

I'm running html2image with local html+css.
I'm confused by the interaction of having a <link ref="stylesheet" ...> in the html vs specifying it via css_file. I seem to need both to get things to work.
It also appears it won't work if these are paths. I have to have my html and css in the same directory for any of it work.
Or am I just missing something?

This may indeed need to be clarified somewhere. Similarly to #47 , using absolute paths for files within <link ref="stylesheet" ...> should do the trick. This is because HTML2Image uses a temporary directory to allow the use of both HTML/CSS files and strings: files are copied to this directory and strings are converted+written as files in this directory.
Alternatively, if you only use existing files and not strings, you could change the temporary directory to the root directory of your html_file, like so:
from html2image import Html2Image
hti = Html2Image(temp_path='./') # assuming the root of your project is the current directory
...

Thank you for such a quick and helpful response!


fixed extra 'U's and added tag_get_frame

tag_get_frame method was added and the extra "u"s which were getting printed was fixed

I added some comments, mainly style related. After you fix them, I will merge the pull request. Thanks for taking your time to contribute to the library.


Please compile it yourself if needed
https://github.com/buhe/KubeCat

@buhe Hey! That is awesome stuff 🤩 Thank you for letting me know, I'll definitely be trying it!


Doubt when set up two peer urls.

I set up two peer urls on each etcd node in my cluster. For some reason, one peer url can't access by other notes.
Normally etcd can switch to the accessible one, print log like this:
2017-12-20 02:21:18.068065 I | etcdserver/membership: added member a9efae717f838092 [https://ETCD-206-8-2-9160-10-2-31-0.grm-etcd.manage.svc.cluster.grm:11006 https://ETCD-206-8-2-9160-10-2-31-1.grm-etcd.manage.svc.cluster.grm:11006] to cluster a10f21f554347d1a
2017-12-20 02:21:18.068134 I | rafthttp: starting peer a9efae717f838092...
2017-12-20 02:21:18.068181 I | rafthttp: started HTTP pipelining with peer a9efae717f838092
2017-12-20 02:21:18.068522 I | rafthttp: started streaming with peer a9efae717f838092 (writer)
2017-12-20 02:21:18.073874 I | rafthttp: started streaming with peer a9efae717f838092 (writer)
2017-12-20 02:21:18.074419 I | rafthttp: started peer a9efae717f838092
2017-12-20 02:21:18.074449 I | rafthttp: started streaming with peer a9efae717f838092 (stream MsgApp v2 reader)
2017-12-20 02:21:18.074476 I | rafthttp: added peer a9efae717f838092
2017-12-20 02:21:18.074500 I | rafthttp: started streaming with peer a9efae717f838092 (stream Message reader)
2017-12-20 02:21:18.646646 I | rafthttp: peer a9efae717f838092 became active
2017-12-20 02:21:18.646686 I | rafthttp: established a TCP streaming connection with peer a9efae717f838092 (stream Message writer)
2017-12-20 02:21:18.647062 I | rafthttp: established a TCP streaming connection with peer a9efae717f838092 (stream MsgApp v2 writer)
2017-12-20 02:21:21.175899 E | rafthttp: failed to dial a9efae717f838092 on stream MsgApp v2 (dial tcp <IP_ADDRESS>:11006: i/o timeout)
2017-12-20 02:21:21.175947 I | rafthttp: peer a9efae717f838092 became inactive
2017-12-20 02:21:21.293895 I | rafthttp: peer a9efae717f838092 became active
2017-12-20 02:21:21.293949 I | rafthttp: established a TCP streaming connection with peer a9efae717f838092 (stream Message reader)
2017-12-20 02:21:21.299375 I | rafthttp: established a TCP streaming connection with peer a9efae717f838092 (stream MsgApp v2 reader)
From logs above, the member a9efae717f838092 added by member API, will became active finally, though its state change: active--inactive--active.
Abnormally, it didn't change active once, and the log is:
2017-12-16 07:28:36.178307 I | etcdserver/membership: added member 6248f0f145a2047 [https://ETCD-206-8-2-9160-10-2-31-0.grm-etcd.manage.svc.cluster.grm:11006 https://ETCD-206-8-2-9160-10-2-31-1.grm-etcd.manage.svc.cluster.grm:11006] to cluster a10f21f554347d1a
2017-12-16 07:28:36.178383 I | rafthttp: starting peer 6248f0f145a2047...
2017-12-16 07:28:36.178406 I | rafthttp: started HTTP pipelining with peer 6248f0f145a2047
2017-12-16 07:28:36.179127 I | rafthttp: started streaming with peer 6248f0f145a2047 (writer)
2017-12-16 07:28:36.179152 I | rafthttp: started peer 6248f0f145a2047
2017-12-16 07:28:36.179170 I | rafthttp: started streaming with peer 6248f0f145a2047 (writer)
2017-12-16 07:28:36.179184 I | rafthttp: added peer 6248f0f145a2047
2017-12-16 07:28:36.179204 I | rafthttp: started streaming with peer 6248f0f145a2047 (stream MsgApp v2 reader)
2017-12-16 07:28:36.179284 I | rafthttp: started streaming with peer 6248f0f145a2047 (stream Message reader)
2017-12-16 07:28:40.592501 I | rafthttp: peer 6248f0f145a2047 became active
2017-12-16 07:28:40.593396 I | rafthttp: established a TCP streaming connection with peer 6248f0f145a2047 (stream Message writer)
2017-12-16 07:28:40.593565 I | rafthttp: established a TCP streaming connection with peer 6248f0f145a2047 (stream MsgApp v2 writer)
2017-12-16 07:28:40.605012 I | rafthttp: established a TCP streaming connection with peer 6248f0f145a2047 (stream Message reader)
2017-12-16 07:28:40.605340 I | rafthttp: established a TCP streaming connection with peer 6248f0f145a2047 (stream MsgApp v2 reader)
2017-12-16 07:28:41.249490 E | rafthttp: failed to write 6248f0f145a2047 on pipeline (dial tcp <IP_ADDRESS>:11006: i/o timeout)
2017-12-16 07:28:41.249533 I | rafthttp: peer 6248f0f145a2047 became inactive
//other logs, but it don't change to active
I puzzle what condition can make a member be marked inactive, and why 6248f0f145a2047 did't change to active as first example.
And the etcd version is 3.1.0 .

I try to reproduce the situation with kinds of condition, but failed..........

I try to reproduce the situation with kinds of condition, but failed..........

Hi @fallblank,  do you mean you can not reproduce the issue or that you can? Can you please post the exact flags/ENV you are passing to etcd to start these nodes so we can try to reproduce?

@hexfusion , thanks for replying.   I can't reproduce it。
start command:
etcd --name ETCD-206-8-2-9160-10-2-31
--data-dir /opt/etcd-data
--initial-advertise-peer-urls https://ETCD-206-8-2-9160-10-2-31-0.grm-etcd.manage.svc.cluster.grm:11006,https://ETCD-206-8-2-9160-10-2-31-1.grm-etcd.manage.svc.cluster.grm:11006
--listen-peer-urls https://<IP_ADDRESS>:11006,https://<IP_ADDRESS>:11006
--advertise-client-urls https://ETCD-206-8-2-9160-10-2-31-0.grm-etcd.manage.svc.cluster.grm:11007,https://ETCD-206-8-2-9160-10-2-31-1.grm-etcd.manage.svc.cluster.grm:11007
--listen-client-urls https://<IP_ADDRESS>:11007,https://<IP_ADDRESS>:11007,https://<IP_ADDRESS>:11007
--initial-cluster ETCD-206-8-2-9160-10-2-31=https://ETCD-206-8-2-9160-10-2-31-0.grm-etcd.manage.svc.cluster.grm:11006,ETCD-206-8-2-9160-10-2-31=https://ETCD-206-8-2-9160-10-2-31-1.grm-etcd.manage.svc.cluster.grm:11006,ETCD-206-8-9-18160-10-9-46=https://ETCD-206-8-9-18160-10-9-46-0.grm-etcd.manage.svc.cluster.grm:11006,ETCD-206-8-9-18160-10-9-46=https://ETCD-206-8-9-18160-10-9-46-1.grm-etcd.manage.svc.cluster.grm:11006,ETCD-206-8-9-168160-10-9-25=https://ETCD-206-8-9-168160-10-9-25-0.grm-etcd.manage.svc.cluster.grm:11006,ETCD-206-8-9-168160-10-9-25=https://ETCD-206-8-9-168160-10-9-25-1.grm-etcd.manage.svc.cluster.grm:11006
--initial-cluster-state existing
--initial-cluster-token grm-etcd
--auto-compaction-retention=1
--heartbeat-interval=1000
--election-timeout=10000
ENV about TLS seem irrespective.

I add members one by one to cluster though V2 Member api.

God! I  reproduce it !!!
it seem a bug, I will attach all logs later.

@fallblank nice work, have you tried against a more recent version of 3.1.x? The issue could be resolved. But yes please post logs.

Sorry for late. All logs below.
the leader node:
<-! TLS INFO IGNORE ->
2017-12-20 13:20:27.753578 I | etcdmain: etcd Version: 3.1.0
2017-12-20 13:20:27.753589 I | etcdmain: Git SHA: 8ba2897
2017-12-20 13:20:27.753594 I | etcdmain: Go Version: go1.7.4
2017-12-20 13:20:27.753598 I | etcdmain: Go OS/Arch: linux/amd64
2017-12-20 13:20:27.753605 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
<-! TLS INFO IGNORE ->
2017-12-20 13:20:27.754851 I | embed: listening for peers on https://<IP_ADDRESS>:2380
2017-12-20 13:20:27.756989 I | embed: listening for peers on https://<IP_ADDRESS>:2380
2017-12-20 13:20:27.757058 I | embed: listening for client requests on <IP_ADDRESS>:2379
2017-12-20 13:20:27.757100 I | embed: listening for client requests on <IP_ADDRESS>:2379
2017-12-20 13:20:27.757171 I | embed: listening for client requests on <IP_ADDRESS>:2379
2017-12-20 13:20:27.764818 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2017-12-20 13:20:27.765176 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:20:27.765239 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:20:27.765306 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:20:27.765341 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:20:27.765416 I | etcdserver: name = ETCD-172-10-2-9192-168-2-31
2017-12-20 13:20:27.765423 I | etcdserver: data dir = ./data
2017-12-20 13:20:27.765429 I | etcdserver: member dir = ./data/member
2017-12-20 13:20:27.765433 I | etcdserver: heartbeat = 1000ms
2017-12-20 13:20:27.765438 I | etcdserver: election = 10000ms
2017-12-20 13:20:27.765443 I | etcdserver: snapshot count = 10000
2017-12-20 13:20:27.765456 I | etcdserver: advertise client URLs = https://ETCD-172-10-2-9192-168-2-31-0.example.svc:2379,https://ETCD-172-10-2-9192-168-2-31-1.example.svc:2379
2017-12-20 13:20:27.765466 I | etcdserver: initial advertise peer URLs = https://ETCD-172-10-2-9192-168-2-31-0.example.svc:2380,https://ETCD-172-10-2-9192-168-2-31-1.example.svc:2380
2017-12-20 13:20:27.765477 I | etcdserver: initial cluster = ETCD-172-10-2-9192-168-2-31=https://ETCD-172-10-2-9192-168-2-31-0.example.svc:2380,ETCD-172-10-2-9192-168-2-31=https://ETCD-172-10-2-9192-168-2-31-1.example.svc:2380
2017-12-20 13:20:27.770447 I | etcdserver: starting member e4ab1f961dc7b7ee in cluster fe85c15888eee52e
2017-12-20 13:20:27.770480 I | raft: e4ab1f961dc7b7ee became follower at term 0
2017-12-20 13:20:27.770496 I | raft: newRaft e4ab1f961dc7b7ee [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2017-12-20 13:20:27.770508 I | raft: e4ab1f961dc7b7ee became follower at term 1
2017-12-20 13:20:27.787560 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2017-12-20 13:20:27.788535 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2017-12-20 13:20:27.788567 I | etcdserver: starting server... [version: 3.1.0, cluster version: to_be_decided]
<-! TLS INFO IGNORE ->
2017-12-20 13:20:27.789148 I | etcdserver/membership: added member e4ab1f961dc7b7ee [https://ETCD-172-10-2-9192-168-2-31-0.example.svc:2380 https://ETCD-172-10-2-9192-168-2-31-1.example.svc:2380] to cluster fe85c15888eee52e
2017-12-20 13:20:32.770847 I | raft: e4ab1f961dc7b7ee is starting a new election at term 1
2017-12-20 13:20:32.770894 I | raft: e4ab1f961dc7b7ee became candidate at term 2
2017-12-20 13:20:32.770918 I | raft: e4ab1f961dc7b7ee received MsgVoteResp from e4ab1f961dc7b7ee at term 2
2017-12-20 13:20:32.770935 I | raft: e4ab1f961dc7b7ee became leader at term 2
2017-12-20 13:20:32.770946 I | raft: raft.node: e4ab1f961dc7b7ee elected leader e4ab1f961dc7b7ee at term 2
2017-12-20 13:20:32.771246 I | etcdserver: setting up the initial cluster version to 3.1
2017-12-20 13:20:32.772405 N | etcdserver/membership: set the initial cluster version to 3.1
2017-12-20 13:20:32.772443 I | etcdserver/api: enabled capabilities for version 3.1
2017-12-20 13:20:32.772475 I | etcdserver: published {Name:ETCD-172-10-2-9192-168-2-31 ClientURLs:[https://ETCD-172-10-2-9192-168-2-31-0.example.svc:2379 https://ETCD-172-10-2-9192-168-2-31-1.example.svc:2379]} to cluster fe85c15888eee52e
2017-12-20 13:20:32.772588 I | embed: ready to serve client requests
2017-12-20 13:20:32.772643 I | embed: ready to serve client requests
2017-12-20 13:20:32.772954 I | embed: serving client requests on <IP_ADDRESS>:2379
2017-12-20 13:20:32.772985 I | embed: serving client requests on <IP_ADDRESS>:2379
2017-12-20 13:20:32.772996 I | embed: ready to serve client requests
2017-12-20 13:20:32.773196 I | embed: serving client requests on <IP_ADDRESS>:2379
2017-12-20 13:20:32.775261 E | etcdmain: forgot to set Type=notify in systemd service file?
2017-12-20 13:22:17.848066 I | etcdserver/membership: added member 580f92ffca2eedb8 [https://ETCD-172-10-2-91192-168-2-3-0.example.svc:2380 https://ETCD-172-10-2-91192-168-2-3-1.example.svc:2380] to cluster fe85c15888eee52e
2017-12-20 13:22:17.848109 I | rafthttp: starting peer 580f92ffca2eedb8...
2017-12-20 13:22:17.848141 I | rafthttp: started HTTP pipelining with peer 580f92ffca2eedb8
2017-12-20 13:22:17.848450 I | rafthttp: started streaming with peer 580f92ffca2eedb8 (writer)
2017-12-20 13:22:17.848607 I | rafthttp: started streaming with peer 580f92ffca2eedb8 (writer)
2017-12-20 13:22:17.851749 I | rafthttp: started peer 580f92ffca2eedb8
2017-12-20 13:22:17.851774 I | rafthttp: started streaming with peer 580f92ffca2eedb8 (stream Message reader)
2017-12-20 13:22:17.851827 I | rafthttp: started streaming with peer 580f92ffca2eedb8 (stream MsgApp v2 reader)
2017-12-20 13:22:17.851916 I | rafthttp: added peer 580f92ffca2eedb8
2017-12-20 13:22:18.549642 I | rafthttp: peer 580f92ffca2eedb8 became active
2017-12-20 13:22:18.549677 I | rafthttp: established a TCP streaming connection with peer 580f92ffca2eedb8 (stream Message writer)
2017-12-20 13:22:18.553147 I | rafthttp: established a TCP streaming connection with peer 580f92ffca2eedb8 (stream Message reader)
2017-12-20 13:22:18.553541 I | rafthttp: established a TCP streaming connection with peer 580f92ffca2eedb8 (stream MsgApp v2 writer)
2017-12-20 13:22:18.555311 I | rafthttp: established a TCP streaming connection with peer 580f92ffca2eedb8 (stream MsgApp v2 reader)
2017-12-20 13:22:43.419926 I | etcdserver/membership: added member d45a805f009e718e [https://ETCD-172-10-9-168192-168-9-25-0.example.svc:2380 https://ETCD-172-10-9-168192-168-9-25-1.example.svc:2380] to cluster fe85c15888eee52e
2017-12-20 13:22:43.419994 I | rafthttp: starting peer d45a805f009e718e...
2017-12-20 13:22:43.420034 I | rafthttp: started HTTP pipelining with peer d45a805f009e718e
2017-12-20 13:22:43.420375 I | rafthttp: started streaming with peer d45a805f009e718e (writer)
2017-12-20 13:22:43.420531 I | rafthttp: started streaming with peer d45a805f009e718e (writer)
2017-12-20 13:22:43.420794 I | rafthttp: started peer d45a805f009e718e
2017-12-20 13:22:43.420818 I | rafthttp: started streaming with peer d45a805f009e718e (stream MsgApp v2 reader)
2017-12-20 13:22:43.420834 I | rafthttp: started streaming with peer d45a805f009e718e (stream Message reader)
2017-12-20 13:22:43.420927 I | rafthttp: added peer d45a805f009e718e
2017-12-20 13:22:44.064512 I | rafthttp: peer d45a805f009e718e became active
2017-12-20 13:22:44.064542 I | rafthttp: established a TCP streaming connection with peer d45a805f009e718e (stream MsgApp v2 writer)
2017-12-20 13:22:44.067126 I | rafthttp: established a TCP streaming connection with peer d45a805f009e718e (stream Message writer)
2017-12-20 13:22:46.521890 E | rafthttp: failed to dial d45a805f009e718e on stream Message (dial tcp <IP_ADDRESS>:2380: i/o timeout)
2017-12-20 13:22:46.521923 I | rafthttp: peer d45a805f009e718e became inactive
2017-12-20 13:22:46.643009 I | rafthttp: peer d45a805f009e718e became active
2017-12-20 13:22:46.643038 I | rafthttp: established a TCP streaming connection with peer d45a805f009e718e (stream Message reader)
2017-12-20 13:22:46.644114 I | rafthttp: established a TCP streaming connection with peer d45a805f009e718e (stream MsgApp v2 reader)
2017-12-20 13:22:46.771089 E | rafthttp: failed to write d45a805f009e718e on pipeline (dial tcp <IP_ADDRESS>:2380: i/o timeout)
2017-12-20 13:22:46.771121 I | rafthttp: peer d45a805f009e718e became inactive
2017-12-20 13:24:12.571998 W | etcdserver: not healthy for reconfigure, rejecting member add {ID:4b4d7d74684a21a RaftAttributes:{PeerURLs:[https://ETCD-172-10-9-18192-168-9-46-0.example.svc:2380 https://ETCD-172-10-9-18192-168-9-46-1.example.svc:2380]} Attributes:{Name: ClientURLs:[]}}
2017-12-20 13:24:12.572031 E | etcdserver/api/v2http: error adding member 4b4d7d74684a21a (etcdserver: unhealthy cluster)
2017-12-20 13:24:12.572046 E | etcdserver/api/v2http: etcdserver: unhealthy cluster
2017-12-20 13:24:22.658983 W | etcdserver: not healthy for reconfigure, rejecting member add {ID:90f1b576bc17c8c4 RaftAttributes:{PeerURLs:[https://ETCD-172-10-9-18192-168-9-46-0.example.svc:2380 https://ETCD-172-10-9-18192-168-9-46-1.example.svc:2380]} Attributes:{Name: ClientURLs:[]}}
2017-12-20 13:24:22.659015 E | etcdserver/api/v2http: error adding member 90f1b576bc17c8c4 (etcdserver: unhealthy cluster)
2017-12-20 13:24:22.659027 E | etcdserver/api/v2http: etcdserver: unhealthy cluster
2017-12-20 13:24:32.826242 W | etcdserver: not healthy for reconfigure, rejecting member add {ID:52d9e88eda0d80a4 RaftAttributes:{PeerURLs:[https://ETCD-172-10-9-18192-168-9-46-0.example.svc:2380 https://ETCD-172-10-9-18192-168-9-46-1.example.svc:2380]} Attributes:{Name: ClientURLs:[]}}
2017-12-20 13:24:32.826283 E | etcdserver/api/v2http: error adding member 52d9e88eda0d80a4 (etcdserver: unhealthy cluster)
2017-12-20 13:24:32.826295 E | etcdserver/api/v2http: etcdserver: unhealthy cluster
------dividing line ----------
follower node 1:
<-! TLS INFO IGNORE ->
2017-12-20 13:22:17.736230 I | etcdmain: etcd Version: 3.1.0
2017-12-20 13:22:17.736240 I | etcdmain: Git SHA: 8ba2897
2017-12-20 13:22:17.736245 I | etcdmain: Go Version: go1.7.4
2017-12-20 13:22:17.736249 I | etcdmain: Go OS/Arch: linux/amd64
2017-12-20 13:22:17.736256 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
<-! TLS INFO IGNORE ->
2017-12-20 13:22:17.737743 I | embed: listening for peers on https://<IP_ADDRESS>:2380
2017-12-20 13:22:17.741519 I | embed: listening for peers on https://<IP_ADDRESS>:2380
2017-12-20 13:22:17.741661 I | embed: listening for client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:17.741749 I | embed: listening for client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:17.741896 I | embed: listening for client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:17.760754 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2017-12-20 13:22:17.801245 I | pkg/netutil: resolving ETCD-172-10-2-91192-168-2-3-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:17.801343 I | pkg/netutil: resolving ETCD-172-10-2-91192-168-2-3-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:17.801422 I | pkg/netutil: resolving ETCD-172-10-2-91192-168-2-3-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:17.801480 I | pkg/netutil: resolving ETCD-172-10-2-91192-168-2-3-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:17.801577 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:17.801631 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:17.801695 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:17.801737 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:17.802381 I | etcdserver: name = ETCD-172-10-2-91192-168-2-3
2017-12-20 13:22:17.802408 I | etcdserver: data dir = ./data
2017-12-20 13:22:17.802420 I | etcdserver: member dir = ./data/member
2017-12-20 13:22:17.802428 I | etcdserver: heartbeat = 1000ms
2017-12-20 13:22:17.802436 I | etcdserver: election = 10000ms
2017-12-20 13:22:17.802444 I | etcdserver: snapshot count = 10000
2017-12-20 13:22:17.802468 I | etcdserver: advertise client URLs = https://ETCD-172-10-2-91192-168-2-3-0.example.svc:2379,https://ETCD-172-10-2-91192-168-2-3-1.example.svc:2379
2017-12-20 13:22:17.814267 I | etcdserver: starting member 580f92ffca2eedb8 in cluster fe85c15888eee52e
2017-12-20 13:22:17.814334 I | raft: 580f92ffca2eedb8 became follower at term 0
2017-12-20 13:22:17.814365 I | raft: newRaft 580f92ffca2eedb8 [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2017-12-20 13:22:17.814372 I | raft: 580f92ffca2eedb8 became follower at term 1
2017-12-20 13:22:17.845365 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2017-12-20 13:22:17.847295 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2017-12-20 13:22:17.847440 I | rafthttp: started HTTP pipelining with peer e4ab1f961dc7b7ee
2017-12-20 13:22:17.847485 I | rafthttp: starting peer e4ab1f961dc7b7ee...
2017-12-20 13:22:17.847511 I | rafthttp: started HTTP pipelining with peer e4ab1f961dc7b7ee
2017-12-20 13:22:17.850116 I | rafthttp: started streaming with peer e4ab1f961dc7b7ee (writer)
2017-12-20 13:22:17.850603 I | rafthttp: started streaming with peer e4ab1f961dc7b7ee (writer)
2017-12-20 13:22:17.853315 I | rafthttp: started peer e4ab1f961dc7b7ee
2017-12-20 13:22:17.853374 I | rafthttp: added peer e4ab1f961dc7b7ee
2017-12-20 13:22:17.853401 I | etcdserver: starting server... [version: 3.1.0, cluster version: to_be_decided]
<-! TLS INFO IGNORE ->
2017-12-20 13:22:17.854174 I | rafthttp: started streaming with peer e4ab1f961dc7b7ee (stream MsgApp v2 reader)
2017-12-20 13:22:17.854647 I | rafthttp: started streaming with peer e4ab1f961dc7b7ee (stream Message reader)
2017-12-20 13:22:17.871255 I | rafthttp: peer e4ab1f961dc7b7ee became active
2017-12-20 13:22:17.871302 I | rafthttp: established a TCP streaming connection with peer e4ab1f961dc7b7ee (stream Message reader)
2017-12-20 13:22:17.874472 I | rafthttp: established a TCP streaming connection with peer e4ab1f961dc7b7ee (stream Message writer)
2017-12-20 13:22:17.875201 I | rafthttp: established a TCP streaming connection with peer e4ab1f961dc7b7ee (stream MsgApp v2 reader)
2017-12-20 13:22:17.877101 I | rafthttp: established a TCP streaming connection with peer e4ab1f961dc7b7ee (stream MsgApp v2 writer)
2017-12-20 13:22:18.095793 I | raft: 580f92ffca2eedb8 [term: 1] received a MsgHeartbeat message with higher term from e4ab1f961dc7b7ee [term: 2]
2017-12-20 13:22:18.095839 I | raft: 580f92ffca2eedb8 became follower at term 2
2017-12-20 13:22:18.095860 I | raft: raft.node: 580f92ffca2eedb8 elected leader e4ab1f961dc7b7ee at term 2
2017-12-20 13:22:18.099394 I | etcdserver/membership: added member e4ab1f961dc7b7ee [https://ETCD-172-10-2-9192-168-2-31-0.example.svc:2380 https://ETCD-172-10-2-9192-168-2-31-1.example.svc:2380] to cluster fe85c15888eee52e
2017-12-20 13:22:18.099598 N | etcdserver/membership: set the initial cluster version to 3.1
2017-12-20 13:22:18.099653 I | etcdserver/api: enabled capabilities for version 3.1
2017-12-20 13:22:18.099820 I | etcdserver/membership: added member 580f92ffca2eedb8 [https://ETCD-172-10-2-91192-168-2-3-0.example.svc:2380 https://ETCD-172-10-2-91192-168-2-3-1.example.svc:2380] to cluster fe85c15888eee52e
2017-12-20 13:22:18.101712 I | etcdserver: published {Name:ETCD-172-10-2-91192-168-2-3 ClientURLs:[https://ETCD-172-10-2-91192-168-2-3-0.example.svc:2379 https://ETCD-172-10-2-91192-168-2-3-1.example.svc:2379]} to cluster fe85c15888eee52e
2017-12-20 13:22:18.101792 I | embed: ready to serve client requests
2017-12-20 13:22:18.101831 I | embed: ready to serve client requests
2017-12-20 13:22:18.102241 I | embed: serving client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:18.102284 I | embed: serving client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:18.103266 E | etcdmain: forgot to set Type=notify in systemd service file?
2017-12-20 13:22:18.104316 I | embed: ready to serve client requests
2017-12-20 13:22:18.104661 I | embed: serving client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:42.741465 I | etcdserver/membership: added member d45a805f009e718e [https://ETCD-172-10-9-168192-168-9-25-0.example.svc:2380 https://ETCD-172-10-9-168192-168-9-25-1.example.svc:2380] to cluster fe85c15888eee52e
2017-12-20 13:22:42.741543 I | rafthttp: starting peer d45a805f009e718e...
2017-12-20 13:22:42.741587 I | rafthttp: started HTTP pipelining with peer d45a805f009e718e
2017-12-20 13:22:42.742486 I | rafthttp: started peer d45a805f009e718e
2017-12-20 13:22:42.742519 I | rafthttp: added peer d45a805f009e718e
2017-12-20 13:22:42.742654 I | rafthttp: started streaming with peer d45a805f009e718e (writer)
2017-12-20 13:22:42.742678 I | rafthttp: started streaming with peer d45a805f009e718e (writer)
2017-12-20 13:22:42.742728 I | rafthttp: started streaming with peer d45a805f009e718e (stream MsgApp v2 reader)
2017-12-20 13:22:42.743096 I | rafthttp: started streaming with peer d45a805f009e718e (stream Message reader)
2017-12-20 13:22:43.384987 I | rafthttp: peer d45a805f009e718e became active
2017-12-20 13:22:43.385026 I | rafthttp: established a TCP streaming connection with peer d45a805f009e718e (stream Message writer)
2017-12-20 13:22:43.387296 I | rafthttp: established a TCP streaming connection with peer d45a805f009e718e (stream MsgApp v2 writer)
2017-12-20 13:22:45.843983 E | rafthttp: failed to dial d45a805f009e718e on stream MsgApp v2 (dial tcp <IP_ADDRESS>:2380: i/o timeout)
2017-12-20 13:22:45.844045 I | rafthttp: peer d45a805f009e718e became inactive
2017-12-20 13:22:45.959883 I | rafthttp: peer d45a805f009e718e became active
2017-12-20 13:22:45.959934 I | rafthttp: established a TCP streaming connection with peer d45a805f009e718e (stream MsgApp v2 reader)
2017-12-20 13:22:45.966790 I | rafthttp: established a TCP streaming connection with peer d45a805f009e718e (stream Message reader)
2017-12-20 13:38:48.312853 W | rafthttp: the clock difference against peer d45a805f009e718e is too high [1.093755938s > 1s]
2017-12-20 13:39:18.313178 W | rafthttp: the clock difference against peer d45a805f009e718e is too high [1.093684526s > 1s]
2017-12-20 13:39:48.435498 W | rafthttp: the clock difference against peer d45a805f009e718e is too high [1.215525866s > 1s]
------dividing line ----------
follower node 2:
<-! TLS INFO IGNORE ->
2017-12-20 13:22:43.192239 I | etcdmain: etcd Version: 3.1.0
2017-12-20 13:22:43.192248 I | etcdmain: Git SHA: 8ba2897
2017-12-20 13:22:43.192253 I | etcdmain: Go Version: go1.7.4
2017-12-20 13:22:43.192259 I | etcdmain: Go OS/Arch: linux/amd64
2017-12-20 13:22:43.192266 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
<-! TLS INFO IGNORE ->
2017-12-20 13:22:43.194168 I | embed: listening for peers on https://<IP_ADDRESS>:2380
2017-12-20 13:22:43.196294 I | embed: listening for peers on https://<IP_ADDRESS>:2380
2017-12-20 13:22:43.196383 I | embed: listening for client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:43.196450 I | embed: listening for client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:43.196567 I | embed: listening for client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:43.204370 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2017-12-20 13:22:43.240976 I | pkg/netutil: resolving ETCD-172-10-2-91192-168-2-3-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241070 I | pkg/netutil: resolving ETCD-172-10-2-91192-168-2-3-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241115 I | pkg/netutil: resolving ETCD-172-10-2-91192-168-2-3-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241148 I | pkg/netutil: resolving ETCD-172-10-2-91192-168-2-3-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241245 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241280 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241327 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241357 I | pkg/netutil: resolving ETCD-172-10-2-9192-168-2-31-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241419 I | pkg/netutil: resolving ETCD-172-10-9-168192-168-9-25-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241450 I | pkg/netutil: resolving ETCD-172-10-9-168192-168-9-25-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241507 I | pkg/netutil: resolving ETCD-172-10-9-168192-168-9-25-0.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.241535 I | pkg/netutil: resolving ETCD-172-10-9-168192-168-9-25-1.example.svc:2380 to <IP_ADDRESS>:2380
2017-12-20 13:22:43.257999 I | etcdserver: name = ETCD-172-10-9-168192-168-9-25
2017-12-20 13:22:43.258044 I | etcdserver: data dir = ./data
2017-12-20 13:22:43.258056 I | etcdserver: member dir = ./data/member
2017-12-20 13:22:43.258065 I | etcdserver: heartbeat = 1000ms
2017-12-20 13:22:43.258078 I | etcdserver: election = 10000ms
2017-12-20 13:22:43.258086 I | etcdserver: snapshot count = 10000
2017-12-20 13:22:43.258116 I | etcdserver: advertise client URLs = https://ETCD-172-10-9-168192-168-9-25-0.example.svc:2379,https://ETCD-172-10-9-168192-168-9-25-1.example.svc:2379
2017-12-20 13:22:43.264228 I | etcdserver: starting member d45a805f009e718e in cluster fe85c15888eee52e
2017-12-20 13:22:43.264293 I | raft: d45a805f009e718e became follower at term 0
2017-12-20 13:22:43.264319 I | raft: newRaft d45a805f009e718e [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2017-12-20 13:22:43.264331 I | raft: d45a805f009e718e became follower at term 1
2017-12-20 13:22:43.351455 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2017-12-20 13:22:43.352462 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2017-12-20 13:22:43.352543 I | rafthttp: started HTTP pipelining with peer 580f92ffca2eedb8
2017-12-20 13:22:43.352697 I | rafthttp: started HTTP pipelining with peer e4ab1f961dc7b7ee
2017-12-20 13:22:43.352745 I | rafthttp: starting peer 580f92ffca2eedb8...
2017-12-20 13:22:43.352851 I | rafthttp: started HTTP pipelining with peer 580f92ffca2eedb8
2017-12-20 13:22:43.354678 I | rafthttp: started streaming with peer 580f92ffca2eedb8 (writer)
2017-12-20 13:22:43.358528 I | rafthttp: started peer 580f92ffca2eedb8
2017-12-20 13:22:43.358601 I | rafthttp: added peer 580f92ffca2eedb8
2017-12-20 13:22:43.358656 I | rafthttp: starting peer e4ab1f961dc7b7ee...
2017-12-20 13:22:43.358690 I | rafthttp: started HTTP pipelining with peer e4ab1f961dc7b7ee
2017-12-20 13:22:43.358936 I | rafthttp: started streaming with peer 580f92ffca2eedb8 (writer)
2017-12-20 13:22:43.358994 I | rafthttp: started streaming with peer 580f92ffca2eedb8 (stream MsgApp v2 reader)
2017-12-20 13:22:43.359875 I | rafthttp: started streaming with peer e4ab1f961dc7b7ee (writer)
2017-12-20 13:22:43.360078 I | rafthttp: started streaming with peer e4ab1f961dc7b7ee (writer)
2017-12-20 13:22:43.360540 I | rafthttp: started streaming with peer 580f92ffca2eedb8 (stream Message reader)
2017-12-20 13:22:43.361335 I | rafthttp: started peer e4ab1f961dc7b7ee
2017-12-20 13:22:43.361366 I | rafthttp: added peer e4ab1f961dc7b7ee
2017-12-20 13:22:43.361384 I | rafthttp: started streaming with peer e4ab1f961dc7b7ee (stream Message reader)
2017-12-20 13:22:43.361481 I | etcdserver: starting server... [version: 3.1.0, cluster version: to_be_decided]
<-! TLS INFO IGNORE ->
2017-12-20 13:22:43.361695 I | rafthttp: started streaming with peer e4ab1f961dc7b7ee (stream MsgApp v2 reader)
2017-12-20 13:22:43.377167 I | rafthttp: peer 580f92ffca2eedb8 became active
2017-12-20 13:22:43.377226 I | rafthttp: established a TCP streaming connection with peer 580f92ffca2eedb8 (stream Message reader)
2017-12-20 13:22:43.377816 I | rafthttp: peer e4ab1f961dc7b7ee became active
2017-12-20 13:22:43.377836 I | rafthttp: established a TCP streaming connection with peer e4ab1f961dc7b7ee (stream MsgApp v2 reader)
2017-12-20 13:22:43.379363 I | rafthttp: established a TCP streaming connection with peer 580f92ffca2eedb8 (stream MsgApp v2 reader)
2017-12-20 13:22:43.380480 I | rafthttp: established a TCP streaming connection with peer e4ab1f961dc7b7ee (stream Message reader)
2017-12-20 13:22:44.084787 I | raft: d45a805f009e718e [term: 1] received a MsgHeartbeat message with higher term from e4ab1f961dc7b7ee [term: 2]
2017-12-20 13:22:44.084838 I | raft: d45a805f009e718e became follower at term 2
2017-12-20 13:22:44.084856 I | raft: raft.node: d45a805f009e718e elected leader e4ab1f961dc7b7ee at term 2
2017-12-20 13:22:44.106075 I | etcdserver/membership: added member e4ab1f961dc7b7ee [https://ETCD-172-10-2-9192-168-2-31-0.example.svc:2380 https://ETCD-172-10-2-9192-168-2-31-1.example.svc:2380] to cluster fe85c15888eee52e
2017-12-20 13:22:44.106220 N | etcdserver/membership: set the initial cluster version to 3.1
2017-12-20 13:22:44.106255 I | etcdserver/api: enabled capabilities for version 3.1
2017-12-20 13:22:44.106348 I | etcdserver/membership: added member 580f92ffca2eedb8 [https://ETCD-172-10-2-91192-168-2-3-0.example.svc:2380 https://ETCD-172-10-2-91192-168-2-3-1.example.svc:2380] to cluster fe85c15888eee52e
2017-12-20 13:22:44.106488 I | etcdserver/membership: added member d45a805f009e718e [https://ETCD-172-10-9-168192-168-9-25-0.example.svc:2380 https://ETCD-172-10-9-168192-168-9-25-1.example.svc:2380] to cluster fe85c15888eee52e
2017-12-20 13:22:44.107896 I | etcdserver: published {Name:ETCD-172-10-9-168192-168-9-25 ClientURLs:[https://ETCD-172-10-9-168192-168-9-25-0.example.svc:2379 https://ETCD-172-10-9-168192-168-9-25-1.example.svc:2379]} to cluster fe85c15888eee52e
2017-12-20 13:22:44.107969 E | etcdmain: forgot to set Type=notify in systemd service file?
2017-12-20 13:22:44.108486 I | embed: ready to serve client requests
2017-12-20 13:22:44.108695 I | embed: serving client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:44.108745 I | embed: ready to serve client requests
2017-12-20 13:22:44.108968 I | embed: serving client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:44.109003 I | embed: ready to serve client requests
2017-12-20 13:22:44.109241 I | embed: serving client requests on <IP_ADDRESS>:2379
2017-12-20 13:22:45.955061 I | rafthttp: established a TCP streaming connection with peer 580f92ffca2eedb8 (stream MsgApp v2 writer)
2017-12-20 13:22:45.956116 I | rafthttp: established a TCP streaming connection with peer e4ab1f961dc7b7ee (stream Message writer)
2017-12-20 13:22:45.957567 I | rafthttp: established a TCP streaming connection with peer e4ab1f961dc7b7ee (stream MsgApp v2 writer)
2017-12-20 13:22:45.958415 I | rafthttp: established a TCP streaming connection with peer 580f92ffca2eedb8 (stream Message writer)
2017-12-20 14:25:27.034994 I | mvcc: store.index: compact 1
2017-12-20 14:25:27.035139 I | mvcc: finished scheduled compaction at 1 (took 46.541µs)

when I run  etcdctl cluster-health command, it return:
member 580f92ffca2eedb8 is healthy: got healthy result from https://ETCD-172-10-2-91192-168-2-3-0.example.svc:2379
member d45a805f009e718e is healthy: got healthy result from https://ETCD-172-10-9-168192-168-9-25-0.example.svc:2379
member e4ab1f961dc7b7ee is healthy: got healthy result from https://ETCD-172-10-2-9192-168-2-31-0.example.svc:2379
cluster is healthy

but on the leader node, it print unhealthy cluster when I try to add a new node to cluster

After I restart leader node process, all thing goes well, the new node can be add normally.

@hexfusion

The issue could be resolved.
Is there a link for relative release note?

@hexfusion

The issue could be resolved.

Is there a link for relative release note?

Is there a link for relative release note?

@fallblank Just a general comment, thanks for the logs I hope to review soon. In the meantime try to replicate against latest? v3.1.11?

Duplicate with https://github.com/coreos/etcd/issues/8383. Should be fixed in v3.3.
Please try https://github.com/coreos/etcd/releases/tag/v3.3.0-rc.0 and reopen if the problem still remains.


please add a function to convert SQL query result to std::vectorJson::Value

in doc
https://github.com/drogonframework/drogon-docs/blob/master/ENG-08-1-DataBase-DbClient.md
there is an example to run SQL query directly
auto clientPtr = drogon::app().getDbClient();
clientPtr->execSqlAsync("select * from users where org_name=$1",
                            [](const drogon::orm::Result &result) {
                                std::cout << result.size() << " rows selected!" << std::endl;
                                int i = 0;
                                for (auto row : result)
                                {
                                    std::cout << i++ << ": user name is " << row["user_name"].as<std::string>() << std::endl;
                                }
                            },
                            [](const DrogonDbException &e) {
                                std::cerr << "error:" << e.base().what() << std::endl;
                            },
                            "default");

we can see, the return class of SQL query result is iterable. For each iterator, the item is a dict of row class.
in drogon/orm/Result.h, there is no constructor function with empty parameters. So it's impossible to construct an empty Result object. In the lambda function, we can not capture an empty Result object and transfer the SQL query result out of lambda function scope.
similarly, there is no constructor function of class Row, so we can't prepare an empty std::vector<Row> to contain the SQL query result out of lambda function scope.
sometimes we need to handle the query result in complex functions, so we need to extrac the data. But there is no function to do it. We have to read the database description to find the column name and column data type, and put it in many lines similar like:
ext_obj[i]["col_name"] = result[i]["col_name"].as<data_type>()

could you please provide a function to convert SQL query result to std::vectorJson::Value, then we can simply extract the data and handle it out of lambda function scope.

Basically, drogon's ORM is what you need here, have you tried it?

yes, I've tried ORM. But we all know ORM can't resolve every trouble.
For example, in Users table, there are 8 columns, in Login action, we just need to check 3 columns username, password, is_active, if we transfer data of all 8 columns, that would bring more load of database server and net tranform.
Of cource, divide a big table with many columns to several tables and connect them by "have one" relationship can resolve this trouble. But this means sometimes we have to take a SQL query across many tables, "many to many" can handle only 3 tables, if we divide a table to many tables, maybe we have to take a query across many tables.
For example. Here is a Users table, and a Companies table, to reduce Users table query load, we divide the user's company information out of User table, and assign it to User_to_Company table. Then we have a Role table, and role is relatade to company, and the relationsip is "many to many". And there is another table AccessRight with "many to many" relationship to Role. If we want to query a users access right, we have to query User->User_to_Company->Companies->"many to many" intermedia table->Role->"many to many" intermedia table->AccessRight. It's very boring to write the query by ORM, and all columns of all tables would be returned, but we only need severy columns, and we can't filter columns, the ORM can't realize this feature.
I believe there must be some more complecated query in practical development. As we all know, manuly edit SQL expression is must for some application. And it's very good SQL expression can be performed directly in drogon. The only pity is it's difficult to extract the query result out. If you can add this function to convert SQL query result to std::vector<Json::Value>, it'll be perfect.

Thanks for your explanations. but I'm a little confused that why you need to extract the query result out. you could do the follow-up work in the callback function or use the synchronous interface (or the coroutine interface as well) to get the result object as a return value.


fix AddTable parameter types

PR Details

Current types are wrong.
Description

if you do wb.AddTable("Sheet1", "A1:B2");  you get invalid arguments
in fact the program expects wb.AddTable("Sheet1", { Range: "A1:B2");
Related Issue

Motivation and Context

How Has This Been Tested

Types of changes

[ ] Docs change / refactoring / dependency upgrade
[x ] Bug fix (non-breaking change which fixes an issue)
[ ] New feature (non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to change)

Checklist

[ ] My code follows the code style of this project.
[ ] My change requires a change to the documentation.
[ ] I have updated the documentation accordingly.
[ ] I have read the CONTRIBUTING document.
[ ] I have added tests to cover my changes.
[ ] All new and existing tests passed.

Codecov Report

Merging #9 (6a89f22) into main (dc8bf36) will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##             main       #9   +/-   ##
=======================================
  Coverage   98.29%   98.29%
=======================================
  Files           1        1
  Lines        2695     2695
=======================================
  Hits         2649     2649
  Misses         35       35
  Partials       11       11

Flag
Coverage Δ

unittests
98.29% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.
:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more


[Cherry-pick] Update release note v1.2.0

Coverage remained the same at 34.459% when pulling bef43074059a638627f5b9632498d62b923d28d1 on yiyi/release_note_1.2.0 into 3de6ad16b14ef8429f72eea1872e4de9498bab3e on master.


[feat] pull-through caching/proxying for images

Background

Motivation: https://github.com/tilt-dev/ctlptl/issues/355

In my "real" Kubernetes clusters, I use ECR as an image registry. Nodes are automatically authorized/configured to pull from ECR through a combination of IAM and containerd settings.

I want my Tilt Kubernetes clusters to mirror "real" clusters as much as possible. I want to avoid making Tilt-specific modifications to Kubernetes manifests to make them work (see discussion in https://github.com/tilt-dev/ctlptl/issues/355).

There currently isn't a way to achieve both of these goals simulaneously:

I could use some combination of docker pull && docker push or  kind load, though this makes the Tilt configuration clunky.
I could provide imagePullSecrets, but this causes the Tilt configuration to deviate from the "real" configuration (and would require modifying hundreds of helm charts).

Note: I think there are other, similar usecases for providing cluster authentication credentials. For example, a user might want to avoid Docker registry ratelimits by providing a user token.

What does this PR do?

This PR adds the ability for a user to configure pull-through proxy/cache registries, which are attached to the kind cluster (possible in other cluster provisioners, but I have chosen this as a starting point).
Authentication can be passed to the proxy via the username and password properties, or via a templated env var to password.

hey @DerekTBrown ! thanks for diving into the tangled mess that is containerd configs.
so...this is complicated. my understanding is that containerd-team is in the middle of removing this functionality.  see the "mirror config deprecation PSA" here:
https://github.com/kubernetes-sigs/kind/releases/tag/v0.20.0
and the big DEPRECATED node at the top of this doc --
https://github.com/containerd/containerd/blob/main/docs/cri/registry.md#configure-image-registry
and that even today, the code you have here will break in a bunch of cases because ctlptl sets config_path. but i haven't chatted with the containerd folks for a while, lemme try to sus out what the right way to do this is.

lol, there's also a big note on why they're removing it :see_no_evil:

NOTE: registry.configs.*.auth is DEPRECATED and will NOT have an equivalent way to store unencrypted secrets in the host configuration files.

one crazy idea -- Kind does let you pass extra args to the kubelet
https://kind.sigs.k8s.io/docs/user/configuration/#kubeadm-config-patches
so you might be able to mount a custom Credential provider that does what you want
https://kubernetes.io/docs/tasks/administer-cluster/kubelet-credential-provider/#configure-a-kubelet-credential-provider
i think this might be closer to what the "real" EKS does to authenticate against ECR?

NOTE: registry.configs.*.auth is DEPRECATED and will NOT have an equivalent way to store unencrypted secrets in the host configuration files.
lemme try to sus out what the right way to do this is.

I am not sure how I missed these deprecation warnings- I have seen this in practice a bunch.
I interpret the deprecation notice to mean that there will be some future interface, but that interface will require storing credentials in an encrypted format.
Assuming that is the case, I think this PR still makes sense: we would just need to migrate to that interface when it becomes available.

one crazy idea -- Kind does let you pass extra args to the kubelet

Assuming we do need to implement an alternative authentication strategy, I have a slightly different approach in mind. We could extend the Registry API spec slightly to allow configuring the Registry as a pull-through cache with authentication:
https://distribution.github.io/distribution/recipes/mirror/#run-a-registry-as-a-pull-through-cache
We would then follow the exact same pattern currently used to redirect localhost:* images to the Cluster registry, but instead to redirect to the Pull-through registry.
I think this has a few advantages:

Because the authentication implementation lives in the registry layer, it is shared across all of the cluster providers; no need to implement authentication for each provider type (though some work would be required of course to do redirects).
I think this could be extra useful when coupled with https://github.com/tilt-dev/ctlptl/issues/346, since users could easily cache upstream images on the machine between tilt ci runs (for example).

(though i'm also fine with trying the proxy approach you linked to)

@nicks should be good to go!


Render appropriate message if a order eligible for free delivery or not

Render a message similar to this on the Freshbey cart page if the order was above Rs. 400.

else render a message stating that how much extra to add so that the order qualifies for free delivery.

Also, take care of the shipping charges on the place order page. If the user is eligible for free delivery, then the shipping charges should be 0 else the shipping will be Rs. 40.

Note the images are taken from Amazon India.

Can I work on this ?

But it seems that you joined Github yesterday.

@roopeshsn can i work on this?

@roopeshsn I would love to work on this issue!

Hi, @ankitdas09 Could you explain your approach to solving this problem? The message should be rendered on the cart page as well as the place order page.

Hi, @ankitdas09 Make sure the message should render on both the cart and shipping pages. If you would like to add the shipping pricing to the cart page you're welcome to do that.

@roopeshsn Sure. Please assign.


Chore Add convenient building of be benchmark

Proposed changes
Issue Number: close #xxx
now we can easily use google benchmark to test complex logic with Doris internal types and functions.

run buildall


xgboost make -j4 Segmentation fault on debian

Environment info
Operating System: debian7
Compiler: g++4.7
Package used (python/R/jvm/C++):make -j4 xgboost
xgboost version used: git clone --recursive https://github.com/dmlc/xgboost
shell install steps：
1、 git clone --recursive https://github.com/dmlc/xgboost
Cloning into 'xgboost'...
remote: Counting objects: 18503, done.
remote: Total 18503 (delta 0), reused 0 (delta 0), pack-reused 18503
Receiving objects: 100% (18503/18503), 6.10 MiB | 215 KiB/s, done.
Resolving deltas: 100% (11206/11206), done.
Submodule 'dmlc-core' (https://github.com/dmlc/dmlc-core) registered for path 'dmlc-core'
Submodule 'rabit' (https://github.com/dmlc/rabit) registered for path 'rabit'
Cloning into 'dmlc-core'...
remote: Counting objects: 3794, done.
remote: Total 3794 (delta 0), reused 0 (delta 0), pack-reused 3794
Receiving objects: 100% (3794/3794), 852.85 KiB | 148 KiB/s, done.
Resolving deltas: 100% (2247/2247), done.
Submodule path 'dmlc-core': checked out 'f35f14f30835af238257b979cc1fac3e41ff3291'
Cloning into 'rabit'...
remote: Counting objects: 3107, done.
remote: Total 3107 (delta 0), reused 0 (delta 0), pack-reused 3107
Receiving objects: 100% (3107/3107), 886.97 KiB | 314 KiB/s, done.
Resolving deltas: 100% (2018/2018), done.
Submodule path 'rabit': checked out 'a9a2a69dc1144180a43f7d2d1097264482be7817'
2、cd xgboost/
3、make -j4
g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/learner.o src/learner.cc >build/learner.d
g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/logging.o src/logging.cc >build/logging.d
g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/c_api/c_api.o src/c_api/c_api.cc >build/c_api/c_api.d
g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/c_api/c_api_error.o src/c_api/c_api_error.cc >build/c_api/c_api_error.d
g++ -c -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp src/c_api/c_api_error.cc -o build/c_api/c_api_error.o
g++ -c -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp src/logging.cc -o build/logging.o
g++ -c -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp src/learner.cc -o build/learner.o
g++ -c -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp src/c_api/c_api.cc -o build/c_api/c_api.o
g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/common/common.o src/common/common.cc >build/common/common.d
g++ -c -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp src/common/common.cc -o build/common/common.o
g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/data/data.o src/data/data.cc >build/data/data.d
g++ -c -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp src/data/data.cc -o build/data/data.o
g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/data/simple_csr_source.o src/data/simple_csr_source.cc >build/data/simple_csr_source.d
g++ -c -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp src/data/simple_csr_source.cc -o build/data/simple_csr_source.o
In file included from src/data/./sparse_page_source.h:12:0,
from src/data/data.cc:16:
dmlc-core/include/dmlc/threadediter.h: In lambda function:
dmlc-core/include/dmlc/threadediter.h:299:27: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.7/README.Bugs> for instructions.
g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/data/simple_dmatrix.o src/data/simple_dmatrix.cc >build/data/simple_dmatrix.d
g++ -c -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp src/data/simple_dmatrix.cc -o build/data/simple_dmatrix.o
Preprocessed source stored into /tmp/cc6b8dWs.out file, please attach this to your bugreport.
make: *** [build/data/data.o] Error 1
make: *** Waiting for unfinished jobs....

Old bug, no answer. Closing


More pretty printer features

implementing aux requests noted in a comment in #90; also see commit messages

[x] add color to previous_hash (field of BlockHeader)
[x] add color to block_signature (field of Consensus)
[x] extend the AST to allow Val::List<Vec<Value>>, use it for lists like transactions and the long list in genesisblocks
[x] implement Pretty for genesis blocks (use same approach as blockchain::normal::Block implementations)

main block

genesis block

This look fine apart from the colour handling. the idea is to have high level values in the AST like Number and Hash,  that will be rendered at the print site with color, hex escape, etc.. depending on their ast type.

handle colors with additional Val constructors

[ ] construct cyan Val::Hash for previous_hash

@vincenthz i have two questions:

what are some other components which require their own constructor? you mentioned Number, is that just any i32/i64/u32/u64 value?
block-signature is a rich value with many subcomponents; how would you like it to be colored?

I think I can help with that:

I can think of these: Addresses; hashes, the Epoch/Slotid; Signatures, public keys
There might be some special objects relevant from the point 1. (signature, hashes, pk), that might be enough for now. We can enhance it later.

Checking out the cardano code reveals what I was misunderstanding:

Pos/Core/Common/Types.hs#L81-L85
Pos/Crypto/Hashing.hs#L86-L90
Pos/Explorer/Web/ClientTypes.hs#L91-L105-- See this page for more explanation - https://cardanodocs.com/cardano/addresses/
-- We have the general type @AbstractHash@ for all hashes we use. It's being parametrized
-- by two types - AbstractHash algo a - the hashing algorithm and the phantom type for
-- extra safety (can be a @Tx@, an @Address@ and so on, ...).
--
-- The following types explain the situation better:

type AddressHash   = AbstractHash Blake2b_224
type Hash          = AbstractHash Blake2b_256

type TxId          = Hash Tx               = AbstractHash Blake2b_256 Tx
type StakeholderId = AddressHash PublicKey = AbstractHash Blake2b_224 PublicKey

@NicolasDP From this I suppose it would make sense for us to have

Val::Hash ..?
Val::AddressHash ..?
Val::TxId -- used for transaction ids
Val::StakeholderId -- used for addresses/publickeys

You don't need AddressHash, it is hidden in the ExtendedAddr and we prefer to display the extended address as base58 all serialised in the appropriate format.
While TxId would be useful, it is not in the data structure to be displayed. But it is still a Hash, so no need to duplicate it in its special sum_type constructor.


Can the RTL8153 work with this as it uses the same driver elsewhere?

Basically the title, can the gigabit version work at max usb 2.0 speeds allowed by the vita?

No


Incorporate Bootswatch themes

Builds on https://github.com/infotexture/dita-bootstrap/pull/91
Additional --bootstrap.theme parameter to download Bootswatch themes
--bootstrap.theme=morph

--bootstrap.theme=sketchy

--bootstrap.theme=cerulean

--bootstrap.theme=lux

 --bootstrap.theme=nome also removes the default CSS when customising  using --args.css and not using the default Bootstrap CSS.

Goals

For those who are fine with vanilla Bootstrap output, I'd like this to work out of the box without further customization or build steps.

If you leave out --bootstrap.theme and --args.css the result is Vanilla Bootstrap. The only additional injected CSS is the grid for mobile responsive HTML.
For a miminal but pleasing change, if you add --bootstrap.theme  you just get one of the standard Bootswatch themes, no fuss. The only additional injected CSS is the grid for mobile responsive HTML.

For many, tweaking a few CSS variables may be enough, so we should make that easy.

--args.css can be used to add some simple custom changes. e.g.  Vanilla Bootstrap + grid + minor changes

For others who are comfortable with Sass & NPM builds, exposing more complex capabilities for overrides would probably be very welcome.

SASS folder is for complex changes. Assumes you have Node.js available:

Edit overrides.scss
Run npm install
Run npm run sass
Build DITA with. --bootstrap.theme=none --args.css=theme

Note that for simplicity, overrides.scss currently just offers the color palette SASS variables. If you really want to go advanced you could override any of the Bootstrap SASS variables.

OK, thanks for the explanations above. The out-of-the-box Bootswatch themes work great. 🙂

https://themestr.app/ is not available online for me. I can't tell if they have updated to 5.3.0. If not it could be dropped.

Nor for me.
I'd prefer to remove this from custom.css and use the Bootswatch themes and Sass-based customization options instead.

Build DITA with. --bootstrap.theme=none --args.css=theme

I think we need to clarify how to use the result of the npm run sass script.
I tested this by changing the primary color value in sass/override.scss and running the script to compile sass/theme.css, but --bootstrap.theme=none --args.css=sass/theme.css did't include the modified styles in the rendered output.

I've reduced this PR to add an extension-point.  SASS generation has been moved to a separate dependent dita-bootstrap.sass  plugin.  If you agree I will move it over here to keep the plugins together.

@jason-fox The repo transfer invitation had expired by the time I got the message. ⏳
Happy to accept if you can re-initiate the transfer process.

@infotexture Done


Update symfony/console requirement

Codecov Report

Merging #24 into master will increase coverage by 0.17%.
The diff coverage is n/a.

@@             Coverage Diff              @@
##             master      #24      +/-   ##
============================================
+ Coverage     19.89%   20.07%   +0.17%
  Complexity      243      243
============================================
  Files             4        4
  Lines           799      792       -7
============================================
  Hits            159      159
+ Misses          640      633       -7

Impacted Files
Coverage Δ
Complexity Δ

src/Migration/Adapter/Database/MySqlAdapter.php
0% <0%> (ø)
22% <0%> (ø)
:arrow_down:

src/Migration/Generator/MigrationGenerator.php
0% <0%> (ø)
38% <0%> (ø)
:arrow_down:

src/Migration/Command/GenerateCommand.php
2.98% <0%> (+0.04%)
14% <0%> (ø)
:arrow_down:

...igration/Adapter/Generator/PhinxMySqlGenerator.php
31.58% <0%> (+0.06%)
169% <0%> (ø)
:arrow_down:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 94849cb...84b904c. Read the comment docs.


[22.11] python3Packages.markdown-it-py: 2.1.0 -> 2.2.0

Description of changes
https://nvd.nist.gov/vuln/detail/CVE-2023-26303
2.2.0 bump is very minimal apart from this fix.
Things done

Built on platform(s)

[x] x86_64-linux
[ ] aarch64-linux
[x] x86_64-darwin
[ ] aarch64-darwin

[ ] For non-Linux: Is sandbox = true set in nix.conf? (See Nix manual)
[ ] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[ ] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[ ] Tested basic functionality of all binary files (usually in ./result/bin/)
23.05 Release Notes (or backporting 22.11 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module

[ ] Fits CONTRIBUTING.md.

No new failures for me on macos 10.15, but obviously haven't done a nixpkgs-review on linux.


iOS 14: Home Screen Widgets

Ideas coming out from WWDC 2020: we should add a widget or two. Open to more ideas for what we should display. I'll go  into detail about one that I've thought of below:
Your Reps
Once users have a location set we have a cached set of your main reps (2 senators, 1 house rep) and it would be nice to give people a Rep Speed Dial widget on their home screen. Medium format, three circles with names and titles below. I'll do a little wireframe when I have a moment to describe it better.

@nickoneill I'm contemplating taking this over and finishing it off. I'm starting by examining the existing code and if I decide to tackle it, I'll leave some more comments below.

@nickoneill I'm contemplating taking this over and finishing it off. I'm starting by examining the existing code and if I decide to tackle it, I'll leave some more comments below.

For starters, which minimum iOS version to envision 1.7 to target?

For starters, which minimum iOS version to envision 1.7 to target?

Thanks @inuwali, I think there's significant work that @subdigital has done here already, he may be open to help finishing it up though.

Thanks @inuwali, I think there's significant work that @subdigital has done here already, he may be open to help finishing it up though.

We currently support 11+ but there are only a handful of users on 11. I am open to dropping support for it if it's beneficial.

We currently support 11+ but there are only a handful of users on 11. I am open to dropping support for it if it's beneficial.

Thanks! I've been in touch with Ben and he's fine to have me to take over. Should I work in a fork, or can you give me write access here?
Ben has definitely done quite a lot of work already; I don't think there's a ton left to do before a potential PR so you can check out the widgets and comment on design/content etc.

Thanks! I've been in touch with Ben and he's fine to have me to take over. Should I work in a fork, or can you give me write access here?
Ben has definitely done quite a lot of work already; I don't think there's a ton left to do before a potential PR so you can check out the widgets and comment on design/content etc.

Awesome, added you as a contributor to this repo, feel free to work in your own fork or on a branch here.

Awesome, added you as a contributor to this repo, feel free to work in your own fork or on a branch here.

Thanks! I'll work on the existing branch.

Thanks! I'll work on the existing branch.

I think I need some team access in order to test on my device. Please advise. :-)

I think I need some team access in order to test on my device. Please advise. :-)

Shoot me an email (nick at 5calls.org) with your preferred email and I'll add you to the team in app store connect

Shoot me an email (nick at 5calls.org) with your preferred email and I'll add you to the team in app store connect


fix: version command translation was reverted by merge whoopsies

:tada: This PR is included in version 3.6.1 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket: